08/03/2016

Limitar SELECT

Boa tarde,

Pessoal, SQL não é minha praia, mas preciso muito de uma ajuda com a questão abaixo, são dados de exemplo e especificamente o que eu quero.

Vamos lá:

Na tabela "Venda" tenho os campos

cod_venda,
nome_peca,
cod_peca,
cliente
...

claro que diferentes clientes compraram o mesmo produto, mas eu precisava a partir de uma listagem de cod_peca trazer somente um cod_venda por cod_peca, um único registro para cada cod_peca que pode ser de qualquer cod_venda, isso não importa e é apenas pra ser usado em um outro processo.

Não é viável eu selecionar todos os dados assim

SELECT * 
  FROM venda
 WHERE cod_peca IN (100, 200, 300, 400, 500)


e depois separar o que eu quero, pq serão milhares de registros e eu vou perder muito tempo.

Alguém, por favor, sabe de alguma claúsula/forma que consiga me ajudar selecionar esses dados?

Se ficou confuso me sinalizem.

Bruno Teles

Respostas

08/03/2016

Marcos P

Se você precisa apenas eliminar as repetições, faça assim :

SELECT DISTINCT cod_venda, cod_peca, nome_peca, cliente
FROM venda
WHERE cod_peca IN (100, 200, 300, 400, 500)


Senão for isso, volte aqui e avise...
Responder Citar

09/03/2016

Bruno Teles

Bom dia Marcos,

Essa cláusula não me ajudou pq o campo COD_VENDA é PRIMARY KEY e aí esse código me trouxe os mesmos resultados. Eu preciso de algo que me retornasse apenas um registro do campo COD_PECA não importando a ordem das outras informações. E partir daí eu iria usar os resultados do campo COD_VENDA em um outro processo.

Valeu pela ajuda.
Responder Citar

09/03/2016

Marcos P

SELECT DISTINCT cod_peca
FROM venda
WHERE cod_peca IN (100, 200, 300, 400, 500)
Responder Citar

09/03/2016

Bruno Teles

Não seria esse meu resultado, eu preciso de algo que me retorne os campos

SELECT cod_venda, cod_peca, nome_peca, cliente
FROM venda
WHERE cod_peca IN (100, 200, 300, 400, 500);


Mas apenas um registro para cada COD_PECA, pq depois preciso usar o COD_VENDA dos resultados em um outro processo.
Responder Citar

09/03/2016

Marcos P

Sua questão está mal formulada...

Você afirma que precisa de todos os campos, mas apenas um registro de COD_PECA terá utilidade para selecionar ( posteriormente ) COD_VENDA.

Se é apenas um registro de COD_PECA, para que os demais campos ?

Faz o seguinte... vai no SqlFiddle, cria a estrutura de dados e popula a tabela com alguns registros.

Depois, retorna aqui com o link que te ajudo com a query.
Responder Citar

09/03/2016

Bruno Teles

Marcos, não consegui usar o SQLFiddle, tentei diversas maneiras e não tive sucesso, não sei o que ficou faltando ou sobrando, mas...

É mais ou menos assim:

Exemplo:

Se eu utilizar isso

SELECT * FROM venda WHERE cod_peca IN (100, 200, 300, 400, 500);


Vai me retornar isso

[img]http://arquivo.devmedia.com.br/forum/imagem/479379-20160309-152446.jpg[/img]

Eu preciso de algo que me retornasse apenas um registro de cada do campo COD_PECA (de acordo com meu WHERE) não importando a ordem das outras informações. E partir daí eu iria usar os resultados do campo COD_VENDA em um outro processo.

Seria resultado como esse

[img]http://arquivo.devmedia.com.br/forum/imagem/479379-20160309-152454%20%281%29.jpg[/img]
Responder Citar

09/03/2016

Marcos P

Bruno,

Os registros selecionados na sua "segunda" consulta são os mesmos da "primeira" consulta... exceto pelo fato que nem todos os registros foram listados na segunda.

Confuso, né mesmo ?!?

Vamos tentar de um outro jeito :

select nroordem, categoria, codservico, dataatend
from ordserv
where categoria in (select distinct categoria from servicos where categoria_ativa = 1)


Essa query retorna os dados (nroordem, categoria, codservico e dataatend) de TODAS as ordens de serviço em que a categoria está ATIVA.

O que resolve isso é...

...categoria in (select distinct categoria from servicos where categoria_ativa = 1)


Que é uma subquery que recupera as categorias ativas ( na tabela categoria ) e faz com que a query principal selecione apenas as ordens de serviço em que a cetegoria esteja no conjunto de dados recuperados pela subquery.

Repare que são duas tabelas diferentes, mas nada impede de aplicar a mesma ideia na mesma tabela.

Consegue adaptar e testar ?
Responder Citar

09/03/2016

Marcos P

Em tempo... segue o link no SqlFiddle com sua estrutura e os dados do exemplo acima.
Responder Citar

09/03/2016

Fabiano Carvalho

Veja se isso resolve seu problema.

select * from (select row_number() over(partition by Cod_Peca order by Cod_Peca) as d,*
from Venda) as v
where d = 1


Essa consulta funciona no SQL Server.

[img]http://arquivo.devmedia.com.br/forum/imagem/332951-20160309-155433.png[/img]
Responder Citar

09/03/2016

Marcos P

Bruno,

Lendo com calma seu exemplo, creio que o código abaixo resolve seu problema ( a princípio ) em qualquer SGBDr :

select *
from venda
where cod_venda in (select min(cod_venda)
                    from venda
                    group by cod_peca)
order by Cod_Peca   


Testa e avisa...

Ok ?!?
Responder Citar

10/03/2016

Bruno Teles

É isso mesmo, perfeito, me ajudou muito esse código.

Obrigado Marcos e FaabiianooC.
Responder Citar