Relatório: Agrupar e Ordenar - Delphi

SQL

Delphi

12/08/2024

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

Curtidas 0

Respostas

Arthur Heinrich

Arthur Heinrich

12/08/2024

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

GOSTEI 0
Renan

Renan

12/08/2024

Olá, Arthur.

Obrigado pela dica, fiz os ajustes aqui e rodou perfeitamente.
GOSTEI 0
POSTAR