Dúvida ao utilizar GroupBy (Postgres SQL)

13 respostas
catia.alessandra

Boa tarde.
Tenho uma SQL que traz as vendas de um determinado período e soma os valores de acordo com a Categoria do Produto.
Só que no cadastro de categoria de produto, cada categoria tem uma categoria pai. E cada categoria tem uma chave de busca.
Por exemplo, todos os produtos que são da categoria “Ferragens” começam com “1”. Os que são “Mat. de Construção” começam com “2”.
Aí vem o meu problema: atualmente, agrupo pela categoria de produto pai, mas existem muitas. O que eu preciso é agrupar (somar) todas as que começam com o mesmo número (conforme citei acima).
E é isto que não consigo fazer. Como vou verificar isso no group by? É meio que fazer um filtro, pelo que entendi.
Segue abaixo minha SQL.

SELECT pc.name,o.DateOrdered,SUM(ol.LineNetAmt) as LineNetAmt FROM C_Order o INNER JOIN C_OrderLine ol ON o.C_Order_ID = ol.C_Order_ID INNER JOIN M_Product p ON ol.M_Product_ID = p.M_Product_ID INNER JOIN M_Product_Category pc ON p.M_Product_Category_ID = pc.M_Product_Category_ID WHERE o.DateOrdered BETWEEN $P{DataIn} AND $P{DataFim} AND o.DocStatus IN ('CO','CL') AND o.C_DocType_ID = 2000033 AND pc.IsActive = 'Y' GROUP BY pc.M_Product_Category_Parent_ID,o.DateOrdered,pc.name ORDER BY o.DateOrdered,pc.name;

Desde ja agradeço. :slight_smile:

13 Respostas

A

ficou um pouco confuso o que vc quer, vou te dar duas opções e ve qual te atende.

  • vc pode colocar mais um filtro no seu where
  • vc pode colocar a opcao HAVING para fazer um filtro no seu agrupamento.

t+

catia.alessandra

alissonvla:
ficou um pouco confuso o que vc quer, vou te dar duas opções e ve qual te atende.

  • vc pode colocar mais um filtro no seu where
  • vc pode colocar a opcao HAVING para fazer um filtro no seu agrupamento.

t+


olá!
é o seguinte: digamos que eu tenha a categoria 1-Ferragens. Dentro de Ferragens eu tenho: 101-Alicate, 102-Martelo, 103-Chaves manuais e assim por diante.
Eu preciso agrupar e somar o valor das vendas desses 3 grupos, pois todos eles pertencem a 1-Ferragens.

Ficou mais claro agora? :smiley:

Eu tentei fazer um Where, mas a questão eh a seguinte: eu preciso trazer todas as categorias, e no where filtraria por uma só. E no Having tentei também, mas só consegui com um valor fixo, como por exemplo:

Obrigada.

catia.alessandra

Meio que achei um modo de fazer, mas não sei se está correto, vou fazer testes ainda.
Mas o DBA daqui não ficou muito animado, pois é com CASE/WHEN

segue abaixo:

SELECT o.DateOrdered,SUM(ol.LineNetAmt) as LineNetAmt, CASE WHEN pc.value like '1%' THEN 'Ferragens' WHEN pc.value like '2%' THEN 'Elétrico' WHEN pc.value like '3%' THEN 'Hidráulico' WHEN pc.value like '4%' THEN 'Tintas' WHEN pc.value like '5%' THEN 'Parafusos' WHEN pc.value like '6%' THEN 'Bosch Black & Decker' WHEN pc.value like '7%' THEN 'Mat.Eletr.Industrial' WHEN pc.value like '8%' THEN 'Almoxarifado' WHEN pc.value like '9%' THEN 'Audio/Video' WHEN pc.value like 'Padrão' THEN 'Padrão' END AS CatProd FROM C_Order o INNER JOIN C_OrderLine ol ON o.C_Order_ID = ol.C_Order_ID INNER JOIN M_Product p ON ol.M_Product_ID = p.M_Product_ID INNER JOIN M_Product_Category pc ON p.M_Product_Category_ID = pc.M_Product_Category_ID WHERE o.DateOrdered BETWEEN '01/11/2011' AND '30/11/2011' AND o.DocStatus IN ('CO','CL') AND o.C_DocType_ID = 2000033 AND pc.IsActive = 'Y' GROUP BY CatProd,o.DateOrdered ORDER BY o.DateOrdered,CatProd;

Mais alguma sugestão?
Obrigada.

A

entendi o que vc quer,
não vi outro jeito para fazer isso tbm nao, ja que sua empresa tem DBA e ele ta achando ruim, pede ele para te dar uma ajuda, para melhorar a performace da sql.

t+

catia.alessandra

Eu conversei com ele, o problema do Case When é que consome muito banco, mas vou fazer testes.
Até agora os testes me mostraram que a lógica está correta.
Obrigada pela ajuda.

Aceito novas sugestões. :slight_smile:

A

olha, se seu banco for oracle, vc pode tentar a sua sql com connect by (recursividade)

t+

catia.alessandra

alissonvla:
olha, se seu banco for oracle, vc pode tentar a sua sql com connect by (recursividade)

t+


É postgres.

A

apartir da versão 8.4, vc tem isso ai
http://www.postgresql.org/docs/current/interactive/queries-with.html
http://andrecf.kinghost.net/freebsd/2010/03/20/queries-recursivas-em-postgresql/

ve se te ajuda

catia.alessandra

Obrigada!
Vou dar uma olhada.

pmlm

Pede ao DBA que crie a tabela de categorias. E que adicione um FK em produto para categoria.

catia.alessandra

pmlm:
catia.alessandra:

Mas o DBA daqui não ficou muito animado, pois é com CASE/WHEN

Pede ao DBA que crie a tabela de categorias. E que adicione um FK em produto para categoria.

Esta tabela já existe e a chave estrangeira tbm.
Mas obrigado de qualquer forma :slight_smile:

pmlm

catia.alessandra:

Esta tabela já existe e a chave estrangeira tbm.
Mas obrigado de qualquer forma :)

Nesse caso não precisas de nenhum case, obtens a categoria directamente da tabela de produtos.

catia.alessandra

pmlm:
catia.alessandra:

Esta tabela já existe e a chave estrangeira tbm.
Mas obrigado de qualquer forma :)

Nesse caso não precisas de nenhum case, obtens a categoria directamente da tabela de produtos.

Sim, eu já tentei dessa forma.
O problema é que são várias subcategorias, e eu preciso que agrupe pela cat. pai.
Mas vou usar o Case when, ai da certinho.

Obrigada a todos.

Criado 28 de novembro de 2011
Ultima resposta 29 de nov. de 2011
Respostas 13
Participantes 3