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;
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?
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
alissonvla
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.
A
alissonvla
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)
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
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.