Relatório: Agrupar e Ordenar - Delphi

12/08/2024

0

Pessoal, estou montando um relatório que liste as contas a pagar num periodo x, agrupadas por grupo de contas
Então montei uma SQL assim no IbExpert, que traz o que eu preciso.

select a.nome_grupo, sum(b.total) as tot_pgto
from grupo_contas as a
inner join tbvencidas as b
on a.codigo = b.cod_grupo_contas
where b.dt_pagamento between ''10.07.2024'' and ''22.07.2024''
group by a.nome_grupo
order by a.nome_grupo


No entanto, no relatório eu quero que esses grupos de contas apareçam quebrados por vencimento e também ordenados por vencimento

ex:

12/08/2024
grupo 1------------total
grupo 2------------total
grupo 3------------total

13/08/2024
grupo 2------------total
grupo 3------------total

Comecei assim, mas gera erro no group by

    Query1.Close;
    Query1.SQL.Clear;
    Query1.SQL.Add(''SELECT D.DATA_DOC, SUM(D.TOTAL) AS TOT, D.VENCIMENTO, D.DT_PAGAMENTO, G.NOME_GRUPO'');
    Query1.SQL.Add(''FROM TBDUPLICATAS AS D'');
    Query1.SQL.Add(''INNER JOIN GRUPO_CONTAS AS G ON G.CODIGO = D.COD_GRUPO_CONTAS'');
    Query1.SQL.Add(''WHERE D.VENCIMENTO >= :INI and D.VENCIMENTO <= :FIM'');

    if cbGrupoContas.Text <> ''TODOS'' then
       Query1.SQL.Add(''and D.COD_GRUPO_CONTAS = ''+ IntToStr(Integer(cbGrupoContas.Items.Objects[cbGrupoContas.ItemIndex])));

    if cbCentroCusto.Text <> ''TODOS'' then
       Query1.SQL.Add(''and D.COD_PROJETO = ''+ IntToStr(Integer(cbCentroCusto.Items.Objects[cbCentroCusto.ItemIndex])));

    Query1.SQL.Add(''GROUP BY G.NOME_GRUPO'');
    Query1.SQL.Add(''ORDER BY D.VENCIMENTO'');
    Query1.ParamByName(''INI'').AsDate := dtpInicio.Date;
    Query1.ParamByName(''FIM'').AsDate := dtpFim.Date;
    Query1.Prepare;
    Query1.Open;
Renan

Renan

Responder

Posts

12/08/2024

Arthur Heinrich

Quando criamos um agrupamento (group by), todas as colunas retornadas precisam ser chaves de agrupamento (aparecendo no GROUP BY) ou valores agregados, em que se aplica alguma função agregadora ( sum(), count(), min(), max(), avg(), etc.).

Na sua query, o group by contém apenas a coluna G.NOME_GRUPO.
As colunas D.DATA_DOC, D.VENCIMENTO e D.DT_PAGAMENTO não pertencem nem ao group by nem utilizam funções de agregação.

Para que apareça com quebra por vencimento, você deveria incluir o vencimento no group by:

select
  b.vencimento, a.nome_grupo, sum(b.total) as tot_pgto
from
  grupo_contas as a
    inner join tbvencidas as b
      on a.codigo = b.cod_grupo_contas
where
  b.dt_pagamento between ''10.07.2024'' and ''22.07.2024''
group by b.vencimento, a.nome_grupo
order by b.vencimento, a.nome_grupo

Responder

13/08/2024

Renan

Olá, Arthur.

Obrigado pela dica, fiz os ajustes aqui e rodou perfeitamente.
Responder

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

Aceitar