Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Group mit 0 Werten - Firebird 2.5 (https://www.delphipraxis.net/204684-group-mit-0-werten-firebird-2-5-a.html)

lowmax_5 18. Jun 2020 20:33

Datenbank: Firebird • Version: 2.5 • Zugriff über: egal

Group mit 0 Werten - Firebird 2.5
 
Hallo,

ich möchte die Rechnungsdaten eines Monats Listen

Code:
select EXTRACT(MONTH FROM r.RECHNUNGDAT) as Monat,
Sum(r.Betragnetto) as BetragNetto
from rechnung R
WHERE EXTRACT(Year FROM r.RECHNUNGDAT)=2019
group by EXTRACT(MONTH FROM r.RECHNUNGDAT)
Das klappt,aber sobald in einem Monat keine Rechnungen bestehen wird auch nichts zurück gegeben.

Gibt es eine elegantere Lösung als ein LEFT JOIN auf eine vorgefüllte Monatstabelle?

Amanda 18. Jun 2020 21:29

AW: Group mit 0 Werten - Firebird 2.5
 
Eine SQL Procedure mit eine for Schleife von 1 - 12

himitsu 18. Jun 2020 22:22

AW: Group mit 0 Werten - Firebird 2.5
 
https://stackoverflow.com/questions/...lect-statement

Aber vielleicht gibt es ja doch im Firebird schon was Fertiges ala generate_series
https://www.postgresql.org/docs/curr...tions-srf.html

Dumpfbacke 19. Jun 2020 05:32

AW: Group mit 0 Werten - Firebird 2.5
 
Das Problem hatte ich auch schon einmal. Es ist ganz einfach zu lösen.

Lege Dir eine Tabelle an mit allen Monaten. Dan geht es ganz einfach. Bei mir war das Problem mit leeren Lagerplätzen welche ich auch haben wollte.

Hier kannst du sehen wie du den Select dann bauen kannst. Ist der erste Beitrag ganz oben

https://www.delphipraxis.net/203497-...it-join-2.html

Es sind aber noch weitere nützliche Tips dort zu sehen. Die anderen Tips sind alle auch nicht schlecht nur der von Holger geht dann am Ende am schnellsten.


Bei allen was Firebird betrifft ist Holger der beste den es gibt. Zumindest aus meiner Sicht. Bei Interesse kannst du Dich Mittwochs einwählen dort erklärt er so einiges

https://www.gotomeet.me/ibexpert.

Frickler 19. Jun 2020 08:23

AW: Group mit 0 Werten - Firebird 2.5
 
Zitat:

Zitat von Dumpfbacke (Beitrag 1467729)
Das Problem hatte ich auch schon einmal. Es ist ganz einfach zu lösen.

Lege Dir eine Tabelle an mit allen Monaten. Dan geht es ganz einfach. Bei mir war das Problem mit leeren Lagerplätzen welche ich auch haben wollte.

Zu der Monatstabelle gabs hier https://www.delphipraxis.net/1394612-post5.html auch nochmal nen heißen Tipp.

alex517 19. Jun 2020 08:52

AW: Group mit 0 Werten - Firebird 2.5
 
Für solche Fälle habe ich stored procedure.
Diese liefert mir den Zeitstrahl mit allen Monaten.

Als ADATUM_VON, ADATUM_BIS wird ein beliebiger Tag im Monat angegeben.


Bsp.:
SQL-Code:
select
  JM.YYYYMM,
  JM.JAHR,
  JM.MONAT,
  Sum(R.Betragnetto) as BetragNetto
from
  SP_JJMM(:von, :bis) JM -- von/bin sind ein beliebiger Tag im Monat
  left join rechnung R on (RECH.RECHNUNGDAT between JM.FIRSTDAY and JM.LASTDAY)

group by
  JM.YYYYMM,
  JM.JAHR,
  JM.MONAT


SQL-Code:
create or alter procedure SP_JJMM (
  ADATUM_VON date,
  ADATUM_BIS date)
returns (
  YYYYMM integer,
  JAHR integer,
  MONAT integer,
  FIRSTDAY date,
  LASTDAY date)
AS
declare M INTEGER;
declare J INTEGER;
declare BM INTEGER;
declare BJ INTEGER;
begin

  IF (ADATUM_VON is not NULL) THEN
  BEGIN
    J = EXTRACT(YEAR FROM ADATUM_VON);
    M = EXTRACT(MONTH FROM ADATUM_VON);
  END ELSE
  BEGIN
    J = EXTRACT(YEAR FROM CURRENT_DATE);
    M = EXTRACT(MONTH FROM CURRENT_DATE);
  END

  IF (ADATUM_BIS is not NULL) THEN
  BEGIN
    BJ = EXTRACT(YEAR FROM ADATUM_BIS);
    BM = EXTRACT(MONTH FROM ADATUM_BIS);
  END ELSE
  BEGIN
    BJ = EXTRACT(YEAR FROM CURRENT_DATE);
    BM = EXTRACT(MONTH FROM CURRENT_DATE);
  END

  JAHR = NULL;
  MONAT = NULL;

  WHILE (J * 100 + M <= BJ * 100 + BM) DO
  BEGIN
    JAHR = J;
    MONAT = M;
    YYYYMM = J * 100 + M;
    FIRSTDAY = J||'-'||M||'-01';
    LASTDAY = DATEADD(MONTH, 1, FIRSTDAY);
    LASTDAY = LASTDAY -1;

    suspend;
    M = M + 1;
    IF (M > 12) THEN
    BEGIN
      M = 1;
      J = J + 1;
    end
  END

end

lowmax_5 19. Jun 2020 11:08

AW: Group mit 0 Werten - Firebird 2.5
 
Vielen Dank für die Tipps. Ich werde es mit Hilfe der SP umsetzen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz