Usuário com melhor resposta
SQL - QUERY PARA SOMAR OS MESES

Pergunta
-
Boa Tarde, Pessoal!!!
Preciso de um auxilio de vocês, espero que ajudem...
Estou com uma seguinte query, está logo a baixo, preciso somar, estou enviando um print para melhor entender.Preciso Criar a linha "C (A+B)" E "F(D+E)"
SELECT CT1_XTIPO,
SUM(JANEIRO) AS JANEIRO,
SUM(FEVEREIRO) AS FEVEREIRO,
CONSOLIDADO= SUM(JANEIRO+FEVEREIRO)
FROM
(
SELECT CONTA, CT1_XTIPO,
SUM(JANEIRO) AS JANEIRO,
SUM(FEVEREIRO) AS FEVEREIRO,
CONSOLIDADO= SUM(JANEIRO+FEVEREIRO)
FROM (
SELECT CONTA, CT1_XTIPO, TIPO,
JANEIRO = CASE WHEN CT2_DATA BETWEEN '20160101' AND '20160131' THEN SUM(CT2_VALOR) ELSE 0 END,
FEVEREIRO = CASE WHEN CT2_DATA BETWEEN '20160201' AND '20160229' THEN SUM(CT2_VALOR) ELSE 0 END
FROM (
SELECT CT2.CT2_DEBITO CONTA, CT1.CT1_XTIPO, CT2.CT2_DATA,
TIPO = CASE WHEN CT1.CT1_NORMAL = '1' THEN 'DEVEDORA' ELSE 'CREDORA' END, CT2.CT2_VALOR * -1 CT2_VALOR
FROM CT2010 CT2 INNER JOIN CT1010 CT1
ON CT2.CT2_DEBITO = CT1.CT1_CONTA AND CT1.D_E_L_E_T_ = '' AND CT1.CT1_XTIPO <> ''
WHERE CT2.CT2_FILIAL = ' '
AND CT2.CT2_MOEDLC = '01' AND CT2.CT2_TPSALD = '1' AND CT2.D_E_L_E_T_ <> '*'
AND CT2.CT2_DATA BETWEEN '20150901' AND '20160229'
UNION ALL
SELECT CT2_CREDIT CONTA, CT1.CT1_XTIPO, CT2.CT2_DATA,
TIPO = CASE WHEN CT1.CT1_NORMAL = '1' THEN 'DEVEDORA' ELSE 'CREDORA' END, CT2_VALOR CREDITO
FROM CT2010 CT2 INNER JOIN CT1010 CT1
ON CT2.CT2_CREDIT = CT1_CONTA AND CT1.D_E_L_E_T_ = '' AND CT1.CT1_XTIPO <> ''
WHERE CT2.CT2_FILIAL = ' '
AND CT2.CT2_MOEDLC = '01' AND CT2.CT2_TPSALD = '1' AND CT2.D_E_L_E_T_ <> '*'
AND CT2.CT2_DATA BETWEEN '20150901' AND '20160229'
) AS TBL1 GROUP BY TBL1.CONTA, TIPO, TBL1.CT1_XTIPO, TBL1.CT2_DATA
) AS TBL2
GROUP BY TBL2.CT1_XTIPO, TBL2.CONTA, TBL2.TIPO
) AS TBL3
GROUP BY TBL3.CT1_XTIPO
Respostas
-
Bom dia,
Experimente fazer uns testes com a query abaixo:
with CTE_Union as ( SELECT CT1.CT1_XTIPO, CT2.CT2_DATA, CT2.CT2_VALOR * -1 CT2_VALOR FROM CT2010 CT2 INNER JOIN CT1010 CT1 ON CT2.CT2_DEBITO = CT1.CT1_CONTA AND CT1.D_E_L_E_T_ = '' AND CT1.CT1_XTIPO <> '' WHERE CT2.CT2_FILIAL = ' ' AND CT2.CT2_MOEDLC = '01' AND CT2.CT2_TPSALD = '1' AND CT2.D_E_L_E_T_ <> '*' AND CT2.CT2_DATA BETWEEN '20160101' AND '20160229' UNION ALL SELECT CT1.CT1_XTIPO, CT2.CT2_DATA, CT2_VALOR FROM CT2010 CT2 INNER JOIN CT1010 CT1 ON CT2.CT2_CREDIT = CT1_CONTA AND CT1.D_E_L_E_T_ = '' AND CT1.CT1_XTIPO <> '' WHERE CT2.CT2_FILIAL = ' ' AND CT2.CT2_MOEDLC = '01' AND CT2.CT2_TPSALD = '1' AND CT2.D_E_L_E_T_ <> '*' AND CT2.CT2_DATA BETWEEN '20160101' AND '20160229' ), CTE_Sum as ( SELECT CASE WHEN CT1_XTIPO IN ('A', 'B') THEN 'C' WHEN CT1_XTIPO IN ('D', 'E') THEN 'F' END AS TIPO_TOTAL, CT1_XTIPO, JANEIRO = SUM(CASE WHEN CT2_DATA BETWEEN '20160101' AND '20160131' THEN CT2_VALOR ELSE 0 END), FEVEREIRO = SUM(CASE WHEN CT2_DATA BETWEEN '20160201' AND '20160229' THEN CT2_VALOR ELSE 0 END) FROM CTE_Union GROUP BY TBL1.CT1_XTIPO ) SELECT CASE WHEN GROUPING_ID(TIPO_TOTAL, CT1_XTIPO) = 1 THEN TIPO_TOTAL ELSE CT1_XTIPO END AS CT1_XTIPO, SUM(JANEIRO) AS JANEIRO, SUM(FEVEREIRO) AS FEVEREIRO, CONSOLIDADO = SUM(JANEIRO+FEVEREIRO) FROM CTE_Sum GROUP BY GROUPING SETS ( (TIPO_TOTAL, CT1_XTIPO), (TIPO_TOTAL) )
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Bruno Souza Silva quarta-feira, 13 de julho de 2016 17:32
Todas as Respostas
-
Boa noite,
Bruno, existe algo em comum entre (A e B) e (D e E)?
Por acaso um dos conjuntos é débito e o outro é credito?
Assinatura: http://www.imoveisemexposicao.com.br
-
-
Bom dia, José Diz.
Não existe algo em comum, mas tem credito e debito sim, não posso colocar tipo na condição, pois existe vários cadastrados, a não ser se for para identificar o Campo Tipo que soma A + B
O que eu preciso implantar neste script é pegar o resultado de cada mês no exemplo: Janeiro - Somar o Tipo 'A' e Tipo 'B' e criar uma linha com a letra 'C' Totalizando A+B, Fevereiro e assim por diante.
Não sei se está forma que expressei conseguiu entender... -
Bruno, considerando que existem vários tipos cadastrados, como seria possível identificar qual tipo deve ser somado com qual?
Assinatura: http://www.imoveisemexposicao.com.br
-
Bom dia.
Nesta situação, teria que colocar no script a condição do campo Tipo A+B e somar e totalizar mês a mês, como do exemplo da imagem da primeira interação que fiz, entendeu?Até mesmo, tem outra situação aqui, que vai ter que somar Tipo F+G+H, mas conseguindo criar está condição do A+B, será automático para esta.
Entendeu?
Grato pela atenção.
Atenciosamente. -
Bom dia,
Experimente fazer uns testes com a query abaixo:
with CTE_Union as ( SELECT CT1.CT1_XTIPO, CT2.CT2_DATA, CT2.CT2_VALOR * -1 CT2_VALOR FROM CT2010 CT2 INNER JOIN CT1010 CT1 ON CT2.CT2_DEBITO = CT1.CT1_CONTA AND CT1.D_E_L_E_T_ = '' AND CT1.CT1_XTIPO <> '' WHERE CT2.CT2_FILIAL = ' ' AND CT2.CT2_MOEDLC = '01' AND CT2.CT2_TPSALD = '1' AND CT2.D_E_L_E_T_ <> '*' AND CT2.CT2_DATA BETWEEN '20160101' AND '20160229' UNION ALL SELECT CT1.CT1_XTIPO, CT2.CT2_DATA, CT2_VALOR FROM CT2010 CT2 INNER JOIN CT1010 CT1 ON CT2.CT2_CREDIT = CT1_CONTA AND CT1.D_E_L_E_T_ = '' AND CT1.CT1_XTIPO <> '' WHERE CT2.CT2_FILIAL = ' ' AND CT2.CT2_MOEDLC = '01' AND CT2.CT2_TPSALD = '1' AND CT2.D_E_L_E_T_ <> '*' AND CT2.CT2_DATA BETWEEN '20160101' AND '20160229' ), CTE_Sum as ( SELECT CASE WHEN CT1_XTIPO IN ('A', 'B') THEN 'C' WHEN CT1_XTIPO IN ('D', 'E') THEN 'F' END AS TIPO_TOTAL, CT1_XTIPO, JANEIRO = SUM(CASE WHEN CT2_DATA BETWEEN '20160101' AND '20160131' THEN CT2_VALOR ELSE 0 END), FEVEREIRO = SUM(CASE WHEN CT2_DATA BETWEEN '20160201' AND '20160229' THEN CT2_VALOR ELSE 0 END) FROM CTE_Union GROUP BY TBL1.CT1_XTIPO ) SELECT CASE WHEN GROUPING_ID(TIPO_TOTAL, CT1_XTIPO) = 1 THEN TIPO_TOTAL ELSE CT1_XTIPO END AS CT1_XTIPO, SUM(JANEIRO) AS JANEIRO, SUM(FEVEREIRO) AS FEVEREIRO, CONSOLIDADO = SUM(JANEIRO+FEVEREIRO) FROM CTE_Sum GROUP BY GROUPING SETS ( (TIPO_TOTAL, CT1_XTIPO), (TIPO_TOTAL) )
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Bruno Souza Silva quarta-feira, 13 de julho de 2016 17:32
-
Boa Tarde, gapimex.
È isso mesmo, vou adaptar a necessidades das regras.
Grato pela sua atenção e tempo dedicado.
Atenciosamente.- Editado Bruno Souza Silva quarta-feira, 13 de julho de 2016 17:32