| 
			
				|  | ActiveDelphi .: O site do programador Delphi! :.
 
 |  
 
	
		| Exibir mensagem anterior :: Exibir próxima mensagem |  
		| Autor | Mensagem |  
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 | 
			
				|  Enviada: Ter Mar 09, 2021 4:59 pm    Assunto: Soma por coluna do mes? |   |  
				| 
 |  
				| Tem como fazer uma soma por coluna desses campos? 
 
  	  | Código: |  	  | SELECT b.nome AS plano_contas,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 1, a.valor, 0)) AS JANEIRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 2, a.valor, 0)) AS FEVEREIRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 3, a.valor, 0)) AS MARCO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 4, a.valor, 0)) AS ABRIL,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 5, a.valor, 0)) AS MAIO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 6, a.valor, 0)) AS JUNHO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 7, a.valor, 0)) AS JULHO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 8, a.valor, 0)) AS AGOSTO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 9, a.valor, 0)) AS SETEMBRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 10, a.valor, 0)) AS OUTUBRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 11, a.valor, 0)) AS NOVEMBRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 12, a.valor, 0)) AS DEZEMBRO,
 SUM(A.VALOR) AS SOMA_COLUNA
 FROM movconta A
 INNER JOIN planodecontas b ON b.id = A.id_planconta
 WHERE a.data between  :pdata1 AND :pdata2
 --- RECEITA
 AND A.TIPO IN (0)
 group BY 1
 | 
 
 O resultado desse select é mes a mes e a SUM(A.VALOR) AS SOMA_COLUNA soma no final da coluna referente ao id_planoconta
 
 Agora preciso de outra soma total pela coluna do mes independente do plano de conta
 
 Sempre será 12 meses
 _________________
 Jogo seu smartphone? Acesse o link e confira.
 https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
 https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Ter Mar 09, 2021 6:01 pm    Assunto: |   |  
				| 
 |  
				| Boa tarde, 
 Não entendi muito bem... você quer que a consulta retorne mais 12 colunas com as somas de todas as contas, ou quer que seja retornado um registro a mais no final com as somas total?
 Qual banco de dados (e versão) você está utilizando?
 
 Editado pela última vez por imex em Qui Set 16, 2021 9:09 am, num total de 1 vez
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 | 
			
				|  Enviada: Ter Mar 09, 2021 6:53 pm    Assunto: |   |  
				| 
 |  
				|  	  | imex escreveu: |  	  | Boa tarde, 
 Não entendi muito bem... você quer que a consulta retorne mais 12 colunas com as somas de todas as contas, ou quer que seja retornado um registro a mais no final com as somas total?
 Qual banco de dados (e versão) você está utilizando?
 
 | 
 
 Boa noite, estou usando Firebird 2.5
 Acho que usa CTE para isso né?
 
 
  	  | Citação: |  	  | ou quer que seja retornado um registro a mais no final com as somas total? | 
 Acho que esse. Ou seja uma linha com os totais
 
 O total por coluna ja faz ai, cfe o nome do plano de contas
 _________________
 Jogo seu smartphone? Acesse o link e confira.
 https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
 https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 | 
			
				|  Enviada: Ter Mar 09, 2021 7:03 pm    Assunto: |   |  
				| 
 |  
				| Acho que não é assim não 
 
  	  | Código: |  	  | with CTE_DRE as (
 SELECT
 B.NOME AS PLANO_CONTAS  ,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 1, a.valor, 0)) AS JANEIRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 2, a.valor, 0)) AS FEVEREIRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 3, a.valor, 0)) AS MARCO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 4, a.valor, 0)) AS ABRIL,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 5, a.valor, 0)) AS MAIO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 6, a.valor, 0)) AS JUNHO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 7, a.valor, 0)) AS JULHO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 8, a.valor, 0)) AS AGOSTO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 9, a.valor, 0)) AS SETEMBRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 10, a.valor, 0)) AS OUTUBRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 11, a.valor, 0)) AS NOVEMBRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 12, a.valor, 0)) AS DEZEMBRO,
 SUM(A.VALOR) AS SOMA_COLUNA
 FROM movconta A
 INNER JOIN planodecontas b ON b.id = A.id_planconta
 WHERE a.data between  :pdata1 AND :pdata2
 --- RECEITA
 AND A.TIPO IN (0)
 group BY 1
 )
 
 select
 PLANO_CONTAS,
 sum(janeiro) as janeiro,
 sum(fevereiro) as fevereiro,
 sum(marco) as marco,
 sum(abril) as abril,
 sum(maio) as maio,
 sum(junho) as junho,
 sum(julho) as julho,
 sum(agosto) as agosto,
 sum(setembro) as setembro,
 sum(outubro) as outubro,
 sum(novembro) as novembro,
 sum(dezembro) as dezembro
 
 from CTE_dre
 group by 1
 | 
 _________________
 Jogo seu smartphone? Acesse o link e confira.
 https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
 https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 | 
			
				|  Enviada: Ter Mar 09, 2021 7:22 pm    Assunto: |   |  
				| 
 |  
				| Nem assim funciona o total 
  	  | Código: |  	  | select PLANO_CONTAS,
 sum(janeiro) as janeiro,
 sum(fevereiro) as fevereiro,
 sum(marco) as marco,
 sum(abril) as abril,
 sum(maio) as maio,
 sum(junho) as junho,
 sum(julho) as julho,
 sum(agosto) as agosto,
 sum(setembro) as setembro,
 sum(outubro) as outubro,
 sum(novembro) as novembro,
 sum(dezembro) as dezembro
 from ( SELECT
 B.NOME AS PLANO_CONTAS  ,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 1, a.valor, 0)) AS JANEIRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 2, a.valor, 0)) AS FEVEREIRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 3, a.valor, 0)) AS MARCO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 4, a.valor, 0)) AS ABRIL,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 5, a.valor, 0)) AS MAIO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 6, a.valor, 0)) AS JUNHO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 7, a.valor, 0)) AS JULHO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 8, a.valor, 0)) AS AGOSTO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 9, a.valor, 0)) AS SETEMBRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 10, a.valor, 0)) AS OUTUBRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 11, a.valor, 0)) AS NOVEMBRO,
 SUM(IIF(EXTRACT(MONTH FROM A.data) = 12, a.valor, 0)) AS DEZEMBRO,
 SUM(A.VALOR) AS SOMA_COLUNA
 FROM movconta A
 INNER JOIN planodecontas b ON b.id = A.id_planconta
 WHERE a.data between  :pdata1 AND :pdata2
 --- RECEITA
 AND A.TIPO IN (0)
 group BY 1) as t2
 group by 1
 | 
 _________________
 Jogo seu smartphone? Acesse o link e confira.
 https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
 https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Qua Mar 10, 2021 12:19 pm    Assunto: |   |  
				| 
 |  
				| Pelo que vi o Firebird ainda não implementou nada parecido com Rollup, Cube ou Grouping Sets para obter essa soma total no final, então acho que as alternativas seriam fazer a soma na aplicação ou tentar utilizar uma stored procedure para retornar o resultado com esse total no final. |  |  
		| Voltar ao Topo |  |  
		|  |  
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 | 
			
				|  Enviada: Qua Mar 10, 2021 2:19 pm    Assunto: |   |  
				| 
 |  
				|  	  | adriano_servitec escreveu: |  	  |  	  | imex escreveu: |  	  | Pelo que vi o Firebird ainda não implementou nada parecido com Rollup, Cube ou Grouping Sets para obter essa soma total no final, então acho que as alternativas seriam fazer a soma na aplicação ou tentar utilizar uma stored procedure para retornar o resultado com esse total no final. | 
 
 Então precisa ser com SP
 
 Como seria o modelo?
 | 
 
 Acho que SP não vai virar tmb
 
 Pois monto dinamicamente a Query cfe MES/ANO selecionado
 
  	  | Código: |  	  | AFDQuery.Close; AFDQuery.SQL.Clear;
 AFDQuery.SQL.Text :=
 '    SELECT' +
 '        B.NOME AS PLANO_CONTAS';
 for I := 0 to QdtdAdd do
 begin
 AFDQuery.SQL.Text :=
 AFDQuery.SQL.Text +
 '  ,SUM(IIF(EXTRACT(MONTH FROM A.DATA) = ' + IntToStr( MesIni ) +
 ', A.VALOR, 0)) AS ' +
 TFuncoes.RemoveAcento(AnsiUpperCase(FormatDateTime('mmmm', IncMonth(DataVal, I))));
 DataFinal := AnsiUpperCase(FormatDateTime('mmmm/yyyy', IncMonth(DataVal, I)));
 if MesIni = 12 then
 MesIni := 1
 else
 Inc(MesIni);
 end;
 AFDQuery.SQL.Text :=
 AFDQuery.SQL.Text +
 '            ,SUM(A.VALOR) AS SOMA_COLUNA '+
 '        FROM MOVCONTA A' +
 '        INNER JOIN PLANODECONTAS B ON B.ID = A.ID_PLANCONTA' +
 '        WHERE CAST(A.DATA AS DATE) BETWEEN :pdata1 AND :pdata2 '+
 '        AND A.TIPO IN  (' + AFiltro + ')' +
 '        GROUP BY 1';
 
 /// Ultima data do filtro
 DataValrFin := EndOfTheMonth( VarToDateTime('01/'+DataFinal) );
 /// Parametros
 AFDQuery.ParamByName('pdata1').AsDate := DataVal;
 AFDQuery.ParamByName('pdata2').AsDate := DataValrFin;
 AFDQuery.Open();
 | 
 
 Como pegaria o valor de cada mes dessa query para jogar em 12 variaveis?
 
 Pois o campo não é fixo como mostrei no primeiro select
 
 Pode começar com JANEIRO/2021 A DEZEMBRO/20201
 
 Ou FEVEREIRO/2020 A JANEIRO/2021
 _________________
 Jogo seu smartphone? Acesse o link e confira.
 https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
 https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Qui Mar 11, 2021 12:17 pm    Assunto: |   |  
				| 
 |  
				| Experimente fazer uns testes com a versão abaixo para ver se é obtido o mesmo resultado: 
 
  	  | Código: |  	  | WITH CTE_COL AS (
 SELECT
 id_planconta,
 (EXTRACT(YEAR FROM data) - :panoini)) * 12 + EXTRACT(MONTH FROM data) - :pmesini as Coluna,
 SUM(valor) as valor
 FROM movconta
 WHERE
 data between :pdataini AND :pdatafim AND
 TIPO IN (0)
 GROUP BY
 1, 2
 )
 
 SELECT
 b.nome AS plano_contas,
 SUM(IIF(a.Coluna = 0, a.valor, 0)) AS COLUNA0,
 SUM(IIF(a.Coluna = 1, a.valor, 0)) AS COLUNA1,
 SUM(IIF(a.Coluna = 2, a.valor, 0)) AS COLUNA2,
 SUM(IIF(a.Coluna = 3, a.valor, 0)) AS COLUNA3,
 SUM(IIF(a.Coluna = 4, a.valor, 0)) AS COLUNA4,
 SUM(IIF(a.Coluna = 5, a.valor, 0)) AS COLUNA5,
 SUM(IIF(a.Coluna = 6, a.valor, 0)) AS COLUNA6,
 SUM(IIF(a.Coluna = 7, a.valor, 0)) AS COLUNA7,
 SUM(IIF(a.Coluna = 8, a.valor, 0)) AS COLUNA8,
 SUM(IIF(a.Coluna = 9, a.valor, 0)) AS COLUNA9,
 SUM(IIF(a.Coluna = 10, a.valor, 0)) AS COLUNA10,
 SUM(IIF(a.Coluna = 11, a.valor, 0)) AS COLUNA11,
 SUM(A.VALOR) AS SOMA_COLUNA
 FROM CTE_COL A
 INNER JOIN planodecontas b ON b.id = A.id_planconta
 group BY 1
 | 
 
 Essa versão utiliza 4 parâmetros, as datas inicial e final que já existiam, e o mes e ano inicial. Se essa versão funcionar, acho que com ela fica viável a criação da SP, pois seria possível passar esses parâmetros.
 
 Espero que ajude
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 | 
			
				|  Enviada: Qui Mar 11, 2021 1:59 pm    Assunto: |   |  
				| 
 |  
				|  	  | imex escreveu: |  	  | Experimente fazer uns testes com a versão abaixo para ver se é obtido o mesmo resultado: 
 
  	  | Código: |  	  | WITH CTE_COL AS (
 SELECT
 id_planconta,
 (EXTRACT(YEAR FROM data) - :panoini)) * 12 + EXTRACT(MONTH FROM data) - :pmesini as Coluna,
 SUM(valor) as valor
 FROM movconta
 WHERE
 data between :pdataini AND :pdatafim AND
 TIPO IN (0)
 GROUP BY
 1, 2
 )
 
 SELECT
 b.nome AS plano_contas,
 SUM(IIF(a.Coluna = 0, a.valor, 0)) AS COLUNA0,
 SUM(IIF(a.Coluna = 1, a.valor, 0)) AS COLUNA1,
 SUM(IIF(a.Coluna = 2, a.valor, 0)) AS COLUNA2,
 SUM(IIF(a.Coluna = 3, a.valor, 0)) AS COLUNA3,
 SUM(IIF(a.Coluna = 4, a.valor, 0)) AS COLUNA4,
 SUM(IIF(a.Coluna = 5, a.valor, 0)) AS COLUNA5,
 SUM(IIF(a.Coluna = 6, a.valor, 0)) AS COLUNA6,
 SUM(IIF(a.Coluna = 7, a.valor, 0)) AS COLUNA7,
 SUM(IIF(a.Coluna = 8, a.valor, 0)) AS COLUNA8,
 SUM(IIF(a.Coluna = 9, a.valor, 0)) AS COLUNA9,
 SUM(IIF(a.Coluna = 10, a.valor, 0)) AS COLUNA10,
 SUM(IIF(a.Coluna = 11, a.valor, 0)) AS COLUNA11,
 SUM(A.VALOR) AS SOMA_COLUNA
 FROM CTE_COL A
 INNER JOIN planodecontas b ON b.id = A.id_planconta
 group BY 1
 | 
 
 Essa versão utiliza 4 parâmetros, as datas inicial e final que já existiam, e o mes e ano inicial. Se essa versão funcionar, acho que com ela fica viável a criação da SP, pois seria possível passar esses parâmetros.
 
 Espero que ajude
 | 
 
 No ibexpert da erro nessa linha
 
  	  | Código: |  	  | (EXTRACT(YEAR FROM data) - :panoini)) * 12 + EXTRACT(MONTH FROM data) - :pmesini as Coluna, 
 | 
 
 Erro
 
  	  | Citação: |  	  | Dynamic SQL Error. SQL error code = -104.
 Token unknown - line 5, column 36.
 ).
 | 
 _________________
 Jogo seu smartphone? Acesse o link e confira.
 https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
 https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Qui Mar 11, 2021 2:14 pm    Assunto: |   |  
				| 
 |  
				| Tem um erro de digitação, um fechamento de parênteses a mais: 
 
  	  | Código: |  	  | (EXTRACT(YEAR FROM data) - :panoini) * 12 + EXTRACT(MONTH FROM data) - :pmesini as Coluna, 
 | 
 
 Espero que ajude
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 | 
			
				|  Enviada: Qui Mar 11, 2021 4:31 pm    Assunto: |   |  
				| 
 |  
				|  	  | adriano_servitec escreveu: |  	  | Ja tinha feito assim Imex, mais mesmo assim da erro de sintaxe 	  | imex escreveu: |  	  | Tem um erro de digitação, um fechamento de parênteses a mais: 
 
  	  | Código: |  	  | (EXTRACT(YEAR FROM data) - :panoini) * 12 + EXTRACT(MONTH FROM data) - :pmesini as Coluna, 
 | 
 
 Espero que ajude
 | 
 
 
  	  | Código: |  	  | Dynamic SQL Error. SQL error code = -804.
 Data type unknown.
 
 | 
 | 
 
 Imex, a indea seria tudo em uma unica grid separando por
 RECEITAS
 englobando todas as receitas cfe select la no primeiro post
 linha abaixo
 total receitas
 linha abaixo
 DESPESAS
 mesma coisa só que no lugar to TIPO = 1
 total despesas
 linha abaixo
 TOTAL GERAL (receita-despesa)
 TODOS MES A MES
 
 Entendeu? Será que consigo fazer assim?
 _________________
 Jogo seu smartphone? Acesse o link e confira.
 https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
 https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Qui Mar 11, 2021 4:34 pm    Assunto: |   |  
				| 
 |  
				| Mas a mensagem de erro mudou. Como você preencheu os parâmetros? Colocou só o ano da data inicial em panoini e só o mes da data inicial em pmesini?
 Vamos ver se funciona primeiro.
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		| adriano_servitec Colaborador
 
  
 
 Registrado: Sexta-Feira, 30 de Janeiro de 2004
 Mensagens: 17618
 
 
 |  |  
		| Voltar ao Topo |  |  
		|  |  
		|  |  
  
	| 
 
 | Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido
 Editar Mensagens: Proibido.
 Excluir Mensagens: Proibido.
 Votar em Enquetes: Proibido.
 
 |  |