Select com SUM!! Meio Complicado!!
Seguinte tenho as seguinte tabelas: PRODUTO, TAB1, TAB2
PRODUTO
...CODPROD
...NOMEPROD
...VALOR
TAB1
...CODPROD
...QTDEPROD
TAB2
...CODPROD
...QTDEPROD
Tava querendo fazer um relatorio pra trazer o valor pago nos produtos!!
tipow assim:
select sum(P.VALOR * T1.QTDEPROD), P.NOMEPROD FROM PRODUTO P
left join TAB1 T1 on (T1.CODPROD = P.CODPROD)
group by P.NOMEPROD
assim funciona pra uma tabela, mas eu quero para as 2 tabelas saca!
tipo assim:
select sum(P.VALOR * T1.QTDEPROD), P.NOMEPROD FROM PRODUTO P
left join TAB1 T1 on (T1.CODPROD = P.CODPROD)
group by P.NOMEPROD
union all
select sum(P.VALOR * T2.QTDEPROD), P.NOMEPROD FROM PRODUTO P
left join TAB1 T2 on (T2.CODPROD = P.CODPROD)
group by P.NOMEPROD
O problema eh que assim ele repete o produto!!!
prod1 valor 10
prod2 valor 20
prod1 valor 30
e eu queria que ficasse somado junto prod1 com prod1 e etc.
algo assim:
select sum(P.VALOR * (T1.QTDEPROD + T2.QTDEPROD)), P.NOMEPROD FROM PRODUTOS P
left join TAB1 T1 ON (T1.CODPROD = P.CODPROD)
left join TAB2 T2 ON (T2.CODPROD = P.CODPROD)
group by P.NOMEPROD
o problema eh que assim nao da certo! ele traz uma soma invalida e em apenas um dos produtos listados e resto traz null!!
to usando Firebird 1.03 alguma coisa!!
sera que tem como fazer isso?? algum sum dentro de outro sum, com union ou sei la???
PRODUTO
...CODPROD
...NOMEPROD
...VALOR
TAB1
...CODPROD
...QTDEPROD
TAB2
...CODPROD
...QTDEPROD
Tava querendo fazer um relatorio pra trazer o valor pago nos produtos!!
tipow assim:
select sum(P.VALOR * T1.QTDEPROD), P.NOMEPROD FROM PRODUTO P
left join TAB1 T1 on (T1.CODPROD = P.CODPROD)
group by P.NOMEPROD
assim funciona pra uma tabela, mas eu quero para as 2 tabelas saca!
tipo assim:
select sum(P.VALOR * T1.QTDEPROD), P.NOMEPROD FROM PRODUTO P
left join TAB1 T1 on (T1.CODPROD = P.CODPROD)
group by P.NOMEPROD
union all
select sum(P.VALOR * T2.QTDEPROD), P.NOMEPROD FROM PRODUTO P
left join TAB1 T2 on (T2.CODPROD = P.CODPROD)
group by P.NOMEPROD
O problema eh que assim ele repete o produto!!!
prod1 valor 10
prod2 valor 20
prod1 valor 30
e eu queria que ficasse somado junto prod1 com prod1 e etc.
algo assim:
select sum(P.VALOR * (T1.QTDEPROD + T2.QTDEPROD)), P.NOMEPROD FROM PRODUTOS P
left join TAB1 T1 ON (T1.CODPROD = P.CODPROD)
left join TAB2 T2 ON (T2.CODPROD = P.CODPROD)
group by P.NOMEPROD
o problema eh que assim nao da certo! ele traz uma soma invalida e em apenas um dos produtos listados e resto traz null!!
to usando Firebird 1.03 alguma coisa!!
sera que tem como fazer isso?? algum sum dentro de outro sum, com union ou sei la???
Fred
Curtidas 0
Respostas
Emerson Nascimento
17/03/2005
sugiro que você instale o FB 1.5.1 daí vc poderá utilizar a função COALESCE():
select P.NOMEPROD, MAX(P.VALOR) * (COALESCE(SUM(T1.QTDEPROD),0) + COALESCE(SUM(T2.QTDEPROD),0)) VALORTOTAL, FROM PRODUTOS P left join TAB1 T1 ON (T1.CODPROD = P.CODPROD) left join TAB2 T2 ON (T2.CODPROD = P.CODPROD) group by P.NOMEPROD
GOSTEI 0
Fred
17/03/2005
Valeu pela ajuda!! Faz dias que estou ensaiando pra passar pro Firebird 1.5, mas to meio enrolado!! Quais seriam as alterações que eu teria que fazer!! quais seriam os problemas?? e o acesso pelo DBExpress?
GOSTEI 0
Faelcavalcanti
17/03/2005
Cara. Já me quebrei também pra fazer este tipo de coisa mas vê se assim funciona :
Agora é o seguinte caso não consigas, tenta tipow fazer com duas queries, por exemplo: uma query tu fazia com a TAB1:
e a outra com a TAB2 tipow:
Eu sei que fica melhor jogar tudo em uma query só devido a componente por grupo e depois fazer o sincronismo. Mas pra não complicar não curto muito utilizar JOIN, não sei o lado benéfico que tanta gente usa principalmente para relatórios.
Espero ter ajudado!!!
SELECT (SUM(P.VALOR * T1.QTDEPROD) + SUM(P.VALOR * T2.QTDEPROD)) AS TOTAL, P.NOMEPROD
FROM PRODUTO P, TAB1 T1, TAB2 T2
WHERE P.CODPROD = T1.CODPROD
AND P.CODPROD = T2.CODPROD
AND T1.CODPROD = T2.CODPROD
GROUP BY P.NOMEPROD
ORDER BY P.NOMEPROD
Agora é o seguinte caso não consigas, tenta tipow fazer com duas queries, por exemplo: uma query tu fazia com a TAB1:
SELECT SUM(P.VALOR * T1.QTDEPROD) AS TOTAL, P.NOMEPROD
FROM PRODUTO P, TAB1 T1, TAB2 T2
WHERE P.CODPROD = T1.CODPROD
AND P.CODPROD = T2.CODPROD
AND T1.CODPROD = T2.CODPROD
GROUP BY P.NOMEPROD
ORDER BY P.NOMEPROD
e a outra com a TAB2 tipow:
SELECT SUM(P.VALOR * T2.QTDEPROD) AS TOTAL, P.NOMEPROD
FROM PRODUTO P, TAB1 T1, TAB2 T2
WHERE P.CODPROD = T1.CODPROD
AND P.CODPROD = T2.CODPROD
AND T1.CODPROD = T2.CODPROD
GROUP BY P.NOMEPROD
ORDER BY P.NOMEPROD
Eu sei que fica melhor jogar tudo em uma query só devido a componente por grupo e depois fazer o sincronismo. Mas pra não complicar não curto muito utilizar JOIN, não sei o lado benéfico que tanta gente usa principalmente para relatórios.
Espero ter ajudado!!!
GOSTEI 0
Emerson Nascimento
17/03/2005
você não precisará fazer nenhuma alteração por conta da troca da versão FB, mas recomenda-se fazer um bkp e restaurar pelo 1.5.1/2.
GOSTEI 0
Fred
17/03/2005
Deu certo nao em faecavalcante, mas valeu!!!
GOSTEI 0