Campo agregado na mesma query
Tem como numa query eu dar um sum e esse resultado como um campo eu agregar em outro? Assim:
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.
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
Curtidas 0
Respostas
Paulo_amorim
04/03/2008
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:
Espero que ajude
Até+
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é+
GOSTEI 0
Paulo
04/03/2008
De uma olhada na minha query e veja o que eu postei. É mais ou menos isso que eue quero
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´
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])
GOSTEI 0
Hall 9000
04/03/2008
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.
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.
GOSTEI 0