Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde galera.
Tenho pesquisado a horas mas ainda não consegui resolver o problema abaixo:
TABELA
"itens"
item_id (PK, int, not null)
linha_id (int, not null)
fornecedor_id (int, not null)
aplicacao_id (int, not null)
catalogo_pdf (varchar(200), null)
ativo (int, null)
data_criacao (datetime, null)
Preciso listar os itens agrupando por fornecedor_id, mas preciso do valor do campo item_id tb.
Já testei com GROUP BY e DISTINCT, mas não consegui, pois tenho que mencionar no GROUP BY e DISTINCT as colunas que desejo selecionar, e com isso não agrupa.
Vi algumas coisas mencionando subquerys, mas não achei muitos detalhes...
Quem poder ajudar, fico muito agradecido.
Valew
Motta, obrigado pelo help, mas tenho q evitar q as linhas se repitam com base na coluna fornecedor_id.
Já tentei com o GROUP BY e DISTINCT, só que como tenho que informar as mesmas colunas do select no GROUP ou DISTINCT, acaba por não agrupar.
Isso aqui agrupa:
[inline]select fornecedor_id from itens group by fornecedor_id[/inline]
mas dentro do loop dos resultados da busca preciso pegar o campo item_id e caso eu coloque esse campo no select da erro, dizendo que:
"A coluna 'itens.item_id' é inválida na lista de seleção porque não está contida em uma função de agregação nem na cláusula GROUP BY."
Teria que alem de colocar no select o campo item_id, colocar no group by, como abaixo:
[inline]select fornecedor_id, item_id from itens group by fornecedor_id, item_id[/inline]
Só que neste caso não agrupa somente pelo fornecedor_id, agrupa tb pelo item_id, e com isso retorna registros com o campo fornecedor_id duplicado.
Valew
Se vc tem mais de um fornecedor_id por item_id não vai rolar.
Tente usar um MAX, mas somente vai trazer um.
Se a sua versão do SQL for superior a versão 2005, pode-se usar o PIVOT
Olá A.Jr.
Obrigado cara, infelizmente o MAX não vai ajudar por trazer apenas um registro. E infelizmente para mim, a versão do SQL é 2005.
Achei q havia uma possibilidade usando subqueries.
Valew
Até tem, mas eu nao consigo montar agora por falta de ambiente, mas acho que tem uns posts na primeira pagina do SQL-Server que tem uma duvida parecida com a sua....
Seria isto
no sql sai
fornecedor item
--------- -----
10 1
10 2
20 1
20 2
30 1
e se quer
fornecedor item
--------- -----
10 1
2
20 1
2
30 1
seria isto ?
================
Creio que vc está confundido o select com a exibição.
A não exibição do Fornecedor é controlada na aplicação não no SQL , em SQL repete e não tem jeito.
Até tem, mas eu nao consigo montar agora por falta de ambiente, mas acho que tem uns posts na primeira pagina do SQL-Server que tem uma duvida parecida com a sua....
Valeu novamente pela ajuda, achei o post -> http://forum.imasters.com.br/topic/40651-group-by/
Testei a dica data e não resolveu. Fiz uma gambiarra dentro do loop para não repetir os dados, mas isso é muito frustrante, vou continuar pesquisando conforme o tempo permitir e caso tenha alguma solução posto aqui.
>
Seria isto
no sql sai
fornecedor item
--------- -----
10 1
10 2
20 1
20 2
30 1
e se quer
fornecedor item
--------- -----
10 1
2
20 1
2
30 1
seria isto ?
================
Creio que vc está confundido o select com a exibição.
A não exibição do Fornecedor é controlada na aplicação não no SQL , em SQL repete e não tem jeito.
Sim, seria isso mesmo Motta.., ainda num estou acreditando que não há alternativas...
Valew
tem sim, com stuff, dense_rank e outra funcao que nao lembro agora de cabeca. como falei estou sem ambiente para testes. assim que eu puder posto um exemplo.
tem sim, com stuff, dense_rank e outra funcao que nao lembro agora de cabeca. como falei estou sem ambiente para testes. assim que eu puder posto um exemplo.
Mas q bacana cara, mais tarde vou pesquisar sobre estes métodos(stuff ou dense_rank), posto aqui o resultado.
obrigado mesmo
Quati,
eu tentei montar uma estrutura parecida com sua, me diga qual a saida que espera de acordo com o resultado abaixo, pois como te falei, tem o STUUF, DENSE_RANK para fazer esta agregação de dados.
declare @itens table (item_id int identity(1,1),linha_id int not null,fornecedor_id int not null,aplicacao_id int not null,catalogo_pdf varchar(200) null,ativo int null,data_criacao datetime null) insert into @itens (linha_id, fornecedor_id,aplicacao_id,catalogo_pdf,ativo,data_criacao)select 1,10,1,'Catalogo 1',1,GETDATE() insert into @itens (linha_id, fornecedor_id,aplicacao_id,catalogo_pdf,ativo,data_criacao)select 1,10,1,'Catalogo 2',1,GETDATE() insert into @itens (linha_id, fornecedor_id,aplicacao_id,catalogo_pdf,ativo,data_criacao)select 1,20,1,'Catalogo 1',1,GETDATE() insert into @itens (linha_id, fornecedor_id,aplicacao_id,catalogo_pdf,ativo,data_criacao)select 1,20,1,'Catalogo 2',1,GETDATE() insert into @itens (linha_id, fornecedor_id,aplicacao_id,catalogo_pdf,ativo,data_criacao)select 1,30,1,'Catalogo 2',1,GETDATE() select fornecedor_id, item_id from @itens
>
Quati,
eu tentei montar uma estrutura parecida com sua, me diga qual a saida que espera de acordo com o resultado abaixo, pois como te falei, tem o STUUF, DENSE_RANK para fazer esta agregação de dados.
declare @itens table (item_id int identity(1,1),linha_id int not null,fornecedor_id int not null,aplicacao_id int not null,catalogo_pdf varchar(200) null,ativo int null,data_criacao datetime null) insert into @itens (linha_id, fornecedor_id,aplicacao_id,catalogo_pdf,ativo,data_criacao)select 1,10,1,'Catalogo 1',1,GETDATE() insert into @itens (linha_id, fornecedor_id,aplicacao_id,catalogo_pdf,ativo,data_criacao)select 1,10,1,'Catalogo 2',1,GETDATE() insert into @itens (linha_id, fornecedor_id,aplicacao_id,catalogo_pdf,ativo,data_criacao)select 1,20,1,'Catalogo 1',1,GETDATE() insert into @itens (linha_id, fornecedor_id,aplicacao_id,catalogo_pdf,ativo,data_criacao)select 1,20,1,'Catalogo 2',1,GETDATE() insert into @itens (linha_id, fornecedor_id,aplicacao_id,catalogo_pdf,ativo,data_criacao)select 1,30,1,'Catalogo 2',1,GETDATE() select fornecedor_id, item_id from @itens
Boa tarde A.Jr!
Tivemos algumas mudanças na linha de raciocínio do programa..., e em função disso, agora aquela alternativa com o MAX e group by resolveria, pois preciso trazer apenas um registro.
Mas enfim, já que chegamos até aqui, se poder finalizar a dica, segue o contexto.
A saída com base nos dados que você simulou a inserção seria algo assim:
fornecedor_id | item_id
10 | 1
- | 2
20 | 3
- | 4
30 | 5
Muito agradecido pela ajuda, valew
>
A saída com base nos dados que você simulou a inserção seria algo assim:
fornecedor_id | item_id
10 | 1
- | 2
20 | 3
- | 4
30 | 5
Esta segunda linha de cada fornecedor_id com um traço, creio que é mais fácil se tratar na aplicação do que na saída do SQL.
Se seu campo item_id estivesse em sequencia e precisasse segregar por fornecedor_id, ai sim, o DENSE_RANK ajudaria.
Creio que basta
SELECT fornecedor_id , item_id
FROM itens
ORDER BY fornecedor_id , item_id