GARANTIR DESCONTO

Fórum Campo agregado na mesma query #354747

04/03/2008

0

Tem como numa query eu dar um sum e esse resultado como um campo eu agregar em outro? Assim:
SELECT A.CAMPO1,(SELECT SUM(B.CAMPO2*2) FROM TB1 B WHERE B.CH1 = A.CH1)SOMA,(SELECT SUM(C.CAMPO1*[color=red:0870122b06]SOMA[/color:0870122b06]) FROM TB1 C WHERE C.CH1 = A.CH1) FROM TB1 A

Observe que o campo SOMA em vermelho, é um agregado de uma subquery. A pergunta e: Tem como fazer algo semelhante? Pois do jeito que está não é possível. Esta query é hipotética, logo falta Group By e etc... É só para exemplificar o que eu quero.


Paulo

Paulo

Responder

Posts

04/03/2008

Paulo_amorim

Olá

Se entendi certo, o que vc chama de SOMA é uma tabela, mas o que vc quer é o resultado do SUM(B.CAMPO2* 2), não?

Não testei, mas se é assim pode-se tentar fazer:

SELECT A.campo1, SUM(C.CAMPO1*parcial) AS total FROM 
A,C,(SELECT SUM(B.CAMPO2*2) AS parcial FROM B, A WHERE B.CH1 = A.CH1) SOMA
WHERE C.CH1 = A.CH1


Espero que ajude

Até+


Responder

Gostei + 0

04/03/2008

Paulo

De uma olhada na minha query e veja o que eu postei. É mais ou menos isso que eue quero

SELECT DISTINCT CAP.CD_FUNC, FUNC.NOME, ACUM_DIA.SOMA ´DIA´ FROM TB_SAC_NF_CAPEADOR CAP INNER JOIN TB_SAC_FUNC FUNC ON(FUNC.CD_FUNC = CAP.CD_FUNC) INNER JOIN (SELECT CP.CD_FUNC, SUM(CP.VL_BRUTO + CP.VL_DESC_ACR) AS SOMA FROM TB_SAC_NF_CAPEADOR CP WHERE ((CP.SR_NF = ´D2´) OR ((CP.SR_NF = ´B2´) AND (CP.CD_CFOP = 6102))) AND (CP.ST_CANC = 0) GROUP BY CP.CD_FUNC)ACUM_DIA ON(ACUM_DIA.CD_FUNC = CAP.CD_FUNC)


Essa query funciona. Na tabela tenho 4 registros para testes, sendo um deles B2 e CFOP 6102. Desta forma funciona, mas se eu colocara mas um pedaço de query em baixo, vem vazio. Eu não possuo registro do E2, mas não deveria vir somente os D2 e B2? O código abaixo vem vazio e em vermelho está o acrescentado:

SELECT DISTINCT CAP.CD_FUNC, FUNC.NOME, ACUM_DIA.SOMA ´DIA´ DEVOLUCAO.DEV ´DEVOLUCAO´, (ACUM_DIA.SOMA+DEVOLUCAO.DEV) ´ACUMULADO´ FROM TB_SAC_NF_CAPEADOR CAP INNER JOIN TB_SAC_FUNC FUNC ON(FUNC.CD_FUNC = CAP.CD_FUNC) INNER JOIN (SELECT CP.CD_FUNC, SUM(CP.VL_BRUTO + CP.VL_DESC_ACR) AS SOMA FROM TB_SAC_NF_CAPEADOR CP WHERE ((CP.SR_NF = ´D2´) OR ((CP.SR_NF = ´B2´) AND (CP.CD_CFOP = 6102))) AND (CP.ST_CANC = 0) GROUP BY CP.CD_FUNC)ACUM_DIA ON(ACUM_DIA.CD_FUNC = CAP.CD_FUNC) [color=´#FF0000´]INNER JOIN (SELECT CP.CD_FUNC, SUM(CP.VL_BRUTO + CP.VL_DESC_ACR) AS DEV FROM TB_SAC_NF_CAPEADOR CP WHERE (CP.SR_NF = ´E2´) AND (CP.ST_CANC = 0) GROUP BY CP.CD_FUNC)DEVOLUCAO ON(DEVOLUCAO.CD_FUNC = CAP.CD_FUNC[/color])



Responder

Gostei + 0

04/03/2008

Hall 9000

Baseado no que vc escreveu acima:
SELECT A.CAMPO1,(SELECT SUM(B.CAMPO2*2) FROM TB1 B WHERE B.CH1 = A.CH1)SOMA,(SELECT SUM(C.CAMPO1*SOMA) FROM TB1 C
WHERE C.CH1 = A.CH1) FROM TB1 A

se entendi seu selecy ficaria assim:

SELECT A.CAMPO1,((SELECT SUM(B.CAMPO2*2) FROM TB1 B WHERE B.CH1 = A.CH1) + (SELECT SUM(C.CAMPO1*SOMA) FROM TB1 C
WHERE C.CH1 = A.CH1)) FROM TB1 A

Fiz uma simulação numa tabela de um banco(Firebird) meu e rodou.
Espero que funcione.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar