Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Quati Maldito

Agrupar com mais de uma coluna

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Preciso listar os itens agrupando por fornecedor_id, mas preciso do valor do campo item_id tb.

 

Creio que basta

SELECT fornecedor_id , item_id
FROM itens
ORDER BY fornecedor_id , item_id

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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....

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

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

Compartilhar este post


Link para o post
Compartilhar em outros sites
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.