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
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.
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
Curtidas 0
Respostas
Marcos P
08/03/2016
Se você precisa apenas eliminar as repetições, faça assim :
Senão for isso, volte aqui e avise...
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...
GOSTEI 0
Bruno Teles
08/03/2016
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.
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.
GOSTEI 0
Marcos P
08/03/2016
SELECT DISTINCT cod_peca FROM venda WHERE cod_peca IN (100, 200, 300, 400, 500)
GOSTEI 0
Bruno Teles
08/03/2016
Não seria esse meu resultado, eu preciso de algo que me retorne os campos
Mas apenas um registro para cada COD_PECA, pq depois preciso usar o COD_VENDA dos resultados em um outro processo.
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.
GOSTEI 0
Marcos P
08/03/2016
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.
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.
GOSTEI 0
Bruno Teles
08/03/2016
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
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]
É 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]
GOSTEI 0
Marcos P
08/03/2016
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 :
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 é...
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 ?
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 ?
GOSTEI 0
Marcos P
08/03/2016
Em tempo... segue o link no SqlFiddle com sua estrutura e os dados do exemplo acima.
GOSTEI 0
Fabiano Carvalho
08/03/2016
Veja se isso resolve seu problema.
Essa consulta funciona no SQL Server.
[img]http://arquivo.devmedia.com.br/forum/imagem/332951-20160309-155433.png[/img]
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]
GOSTEI 0
Marcos P
08/03/2016
Bruno,
Lendo com calma seu exemplo, creio que o código abaixo resolve seu problema ( a princípio ) em qualquer SGBDr :
Testa e avisa...
Ok ?!?
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 ?!?
GOSTEI 0
Bruno Teles
08/03/2016
É isso mesmo, perfeito, me ajudou muito esse código.
Obrigado Marcos e FaabiianooC.
Obrigado Marcos e FaabiianooC.
GOSTEI 0