Soma em SUB-SELECT
Estou precisando gerar uma consulta com as seguintes colunas:
REGISTRO | NOME | PROVENTOS | DESCONTOS | LIQUIDO
Onde:
REGISTRO e NOME encontram-se na tabela FPCF120
PROVENTOS e DESCONTO deve ser gerada pela soma das colunas VALOR_MOV da tabela FPMM110.
Em FPMM110 encontram-se os registros armazenadas nas colunas MMAA_REF, COD_RUB e VALOR_MOV
Segue a estrutura de FPMM110:
MMAA_REF (Mês e Ano de referencia)
COD_RUB (Codigo da Rubrica) os códigos menores que “2000” são proventos e os códigos maiores ou iguais a “2000” são descontos.
Então tudo bem, montei o seguinte SQL:
SELECT F.REGISTRO,F.NOME,F.MMAA_REF,
( SELECT SUM(A.VALOR_MOV) FROM FPMM110 AS A WHERE A.MMAA_REF = "0115" AND A.COD_RUB < "2000" ) AS PROVENTOS,
( SELECT SUM(B.VALOR_MOV) FROM FPMM110 AS B WHERE B.MMAA_REF = "0115" AND B.COD_RUB >= "2000" ) AS DESCONTOS,
(
(SELECT SUM(A.VALOR_MOV) FROM FPMM110 AS A WHERE A.MMAA_REF = "0115" AND A.COD_RUB < "2000" ) -
(SELECT SUM(B.VALOR_MOV) FROM FPMM110 AS B WHERE B.MMAA_REF = "0115" AND B.COD_RUB >= "2000" )
) AS LIQUIDO
FROM FPCF120 AS F
INNER JOIN FPMM110 AS M ON (F.REGISTRO = M.REGISTRO) AND (F.MMAA_REF = M.MMAA_REF)
WHERE F.MMAA_REF = "0115" AND M.COD_RUB < "2000"
GROUP BY F.REGISTRO,F.NOME,F.MMAA_REF
O problema está, que o resultado da Coluna PROVENTOS E DESCONTOS está retornando a soma geral de todos os funcionários juntos, o que deveria ser linha por linha onde cada linha é um funcionário.
Exemplo do resultado
REGISTRO | NOME | PROVENTOS | DESCONTOS | LIQUIDO
00001 ANTONIO CARLOS 4056.00 123.00 3933.00
00002 MARCELO HENRIQUE 4056.00 123.00 3933.00
00003 ANA CAROLINE 4056.00 123.00 3933.00
00004 JOSE COSTA 4056.00 123.00 3933.00
Só exibindo os primeiros registros, da tabela FPMM110:
REGISTRO | MMAA_REF | COD_RUB | VALOR_MOV
00001 0115 1001 1200,00
00001 0115 1010 200,00
00001 0115 2112 50,00
00002 0115 1001 800,00
00002 0115 1023 30,00
00002 0115 2001 25,00
00003 0115 1001 788,00
00003 0115 1010 45,00
00003 0115 2013 34,00
00004 0115 1001 958,00
00004 0115 1010 35,00
00004 0115 2013 14,00
Obs:
A soma de todos os valores da coluna VALOR_MOV para Rubricas menor que “2000” é 4.056,00
A soma de todos os valores da coluna VALOR_MOV para Rubricas maior ou igua a “2000” é 123,00
Então o problema é que não estão somando os valores individualmente para cada funcionário e sim os valores estão sendo repetidos para todos os funcionários e também está vindo a soma total de todos os valores em VALOR_MOV da tabela FPMM110 que possem MMAA_REF = "0115".
Alguém poderia me ajudar?
REGISTRO | NOME | PROVENTOS | DESCONTOS | LIQUIDO
Onde:
REGISTRO e NOME encontram-se na tabela FPCF120
PROVENTOS e DESCONTO deve ser gerada pela soma das colunas VALOR_MOV da tabela FPMM110.
Em FPMM110 encontram-se os registros armazenadas nas colunas MMAA_REF, COD_RUB e VALOR_MOV
Segue a estrutura de FPMM110:
MMAA_REF (Mês e Ano de referencia)
COD_RUB (Codigo da Rubrica) os códigos menores que “2000” são proventos e os códigos maiores ou iguais a “2000” são descontos.
Então tudo bem, montei o seguinte SQL:
SELECT F.REGISTRO,F.NOME,F.MMAA_REF,
( SELECT SUM(A.VALOR_MOV) FROM FPMM110 AS A WHERE A.MMAA_REF = "0115" AND A.COD_RUB < "2000" ) AS PROVENTOS,
( SELECT SUM(B.VALOR_MOV) FROM FPMM110 AS B WHERE B.MMAA_REF = "0115" AND B.COD_RUB >= "2000" ) AS DESCONTOS,
(
(SELECT SUM(A.VALOR_MOV) FROM FPMM110 AS A WHERE A.MMAA_REF = "0115" AND A.COD_RUB < "2000" ) -
(SELECT SUM(B.VALOR_MOV) FROM FPMM110 AS B WHERE B.MMAA_REF = "0115" AND B.COD_RUB >= "2000" )
) AS LIQUIDO
FROM FPCF120 AS F
INNER JOIN FPMM110 AS M ON (F.REGISTRO = M.REGISTRO) AND (F.MMAA_REF = M.MMAA_REF)
WHERE F.MMAA_REF = "0115" AND M.COD_RUB < "2000"
GROUP BY F.REGISTRO,F.NOME,F.MMAA_REF
O problema está, que o resultado da Coluna PROVENTOS E DESCONTOS está retornando a soma geral de todos os funcionários juntos, o que deveria ser linha por linha onde cada linha é um funcionário.
Exemplo do resultado
REGISTRO | NOME | PROVENTOS | DESCONTOS | LIQUIDO
00001 ANTONIO CARLOS 4056.00 123.00 3933.00
00002 MARCELO HENRIQUE 4056.00 123.00 3933.00
00003 ANA CAROLINE 4056.00 123.00 3933.00
00004 JOSE COSTA 4056.00 123.00 3933.00
Só exibindo os primeiros registros, da tabela FPMM110:
REGISTRO | MMAA_REF | COD_RUB | VALOR_MOV
00001 0115 1001 1200,00
00001 0115 1010 200,00
00001 0115 2112 50,00
00002 0115 1001 800,00
00002 0115 1023 30,00
00002 0115 2001 25,00
00003 0115 1001 788,00
00003 0115 1010 45,00
00003 0115 2013 34,00
00004 0115 1001 958,00
00004 0115 1010 35,00
00004 0115 2013 14,00
Obs:
A soma de todos os valores da coluna VALOR_MOV para Rubricas menor que “2000” é 4.056,00
A soma de todos os valores da coluna VALOR_MOV para Rubricas maior ou igua a “2000” é 123,00
Então o problema é que não estão somando os valores individualmente para cada funcionário e sim os valores estão sendo repetidos para todos os funcionários e também está vindo a soma total de todos os valores em VALOR_MOV da tabela FPMM110 que possem MMAA_REF = "0115".
Alguém poderia me ajudar?
Daniel Tenorio
Curtidas 0
Respostas
Fernando
04/02/2015
Olá.
Mesmo problema por aqui, e no meu caso mais simples, pois estou usando apenas uma tabela. Pela lógica as subconsultas teriam que estar agrupando pelo REGISTRO.
No meu caso pelo pro2.procod, mas com agrupando na subselect dá erro
select pro2.PROCOD, (SELECT SUM(PRO2.PROQTEST) FROM PRO2 where PRO2.LOJCOD = 1 group by PRO2.PROCOD) ,
(SELECT SUM(PRO2.PROQTEST) FROM PRO2 where PRO2.LOJCOD = 3 group by PRO2.PROCOD) from pro2
group by pro2.procod
order by PRO2.PROCOD
Alguém por aí tem uma solução?
Mesmo problema por aqui, e no meu caso mais simples, pois estou usando apenas uma tabela. Pela lógica as subconsultas teriam que estar agrupando pelo REGISTRO.
No meu caso pelo pro2.procod, mas com agrupando na subselect dá erro
select pro2.PROCOD, (SELECT SUM(PRO2.PROQTEST) FROM PRO2 where PRO2.LOJCOD = 1 group by PRO2.PROCOD) ,
(SELECT SUM(PRO2.PROQTEST) FROM PRO2 where PRO2.LOJCOD = 3 group by PRO2.PROCOD) from pro2
group by pro2.procod
order by PRO2.PROCOD
Alguém por aí tem uma solução?
GOSTEI 0
Isaac Jose
04/02/2015
Olá.
Mesmo problema por aqui, e no meu caso mais simples, pois estou usando apenas uma tabela. Pela lógica as subconsultas teriam que estar agrupando pelo REGISTRO.
No meu caso pelo pro2.procod, mas com agrupando na subselect dá erro
select pro2.PROCOD, (SELECT SUM(PRO2.PROQTEST) FROM PRO2 where PRO2.LOJCOD = 1 group by PRO2.PROCOD) ,
(SELECT SUM(PRO2.PROQTEST) FROM PRO2 where PRO2.LOJCOD = 3 group by PRO2.PROCOD) from pro2
group by pro2.procod
order by PRO2.PROCOD
Alguém por aí tem uma solução?
Mesmo problema por aqui, e no meu caso mais simples, pois estou usando apenas uma tabela. Pela lógica as subconsultas teriam que estar agrupando pelo REGISTRO.
No meu caso pelo pro2.procod, mas com agrupando na subselect dá erro
select pro2.PROCOD, (SELECT SUM(PRO2.PROQTEST) FROM PRO2 where PRO2.LOJCOD = 1 group by PRO2.PROCOD) ,
(SELECT SUM(PRO2.PROQTEST) FROM PRO2 where PRO2.LOJCOD = 3 group by PRO2.PROCOD) from pro2
group by pro2.procod
order by PRO2.PROCOD
Alguém por aí tem uma solução?
bom dia...
talvez isso ajude.
select prod2.prodcod,
LOJCOD1 = case when PRO2.LOJCOD = 1 then SUM(PRO2.PROQTEST)
end,
LOJCOD3 = case when PRO2.LOJCOD = 3 then SUM(PRO2.PROQTEST)
end
from prod2
GOSTEI 0