Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Zwei Tabellen verknüpfen und summieren aber mit NULLs (https://www.delphipraxis.net/214112-zwei-tabellen-verknuepfen-und-summieren-aber-mit-nulls.html)

TurboMagic 17. Nov 2023 21:35

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

Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Hallo,

ich habe ein SQL Problem und noch keine passende Lösung.

Es gibt 2 Tabellen:

Code:
1. BonPos P mit diesen relevanten Spalten:
   KASSENABSCHLUSS_NR, BON_ID, GV_TYP

2. BonPos_Ust PU mit diesen relevanten Spalten:
   Z_KASSE_ID, KASSENABSCHLUSS_NR, BON_ID, POS_BRUTTO
Mein bisheriges SQL Statement:

Code:
 
select pu.KASSENABSCHLUSS_NR, SUM(pu.POS_BRUTTO)
from KASSE_BONPOS_UST pu, KASSE_BONPOS p
where (pu.Z_KASSE_ID = 'MeineKasse') and
      (pu.KASSENABSCHLUSS_NR = p.KASSENABSCHLUSS_NR) and
      (pu.BON_ID = p.BON_ID) and
      (p.GV_TYP = 11)
group by pu.KASSENABSCHLUSS_NR
order by pu.KASSENABSCHLUSS_NR
Das produziert eine Liste aller Bruttosummen aller
Belege die GV_TYP = 11 Buchungen beinhalten.

Das ist zwar schon ganz nett, aber ich bräuchte im Ergebnis für
jede KASSENABSCHLUSS_NR für die es keine GV_TYP = 11 Buchungen
gibt auch einen Eintrag. Die Summe wäre in dem Fall dann 0.

Geht das? Falls ja, wie?

Grüße
TurboMagic

Uwe Raabe 17. Nov 2023 22:50

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Ohne Testmöglichkeit nur so dahingetippt:
SQL-Code:
select p.KASSENABSCHLUSS_NR, SUM(pu.POS_BRUTTO)
from KASSE_BONPOS p
left join KASSE_BONPOS_UST pu
   on (pu.Z_KASSE_ID = 'MeineKasse') and
      (pu.KASSENABSCHLUSS_NR = p.KASSENABSCHLUSS_NR) and
      (pu.BON_ID = p.BON_ID)
WHERE (p.GV_TYP = 11)
group by p.KASSENABSCHLUSS_NR
order by p.KASSENABSCHLUSS_NR

TurboMagic 17. Nov 2023 23:03

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Danke für den netten Versuch, nur leider liefert er nicht das richtige Ergebnis.
Er liefert jetzt alle KASSENABSCHLUSS_NR Zeilen die eine Null Summe produzieren.
Jetzt müssten da noch diejenigen dazwischen, die für GV_TYP = 11 eine Summe > 0
haben...

Uwe Raabe 17. Nov 2023 23:29

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Ich habe offenbar die Anforderung noch nicht richtig verstanden. Hilfreich wäre hier ein konkretes Beispiel mit dem gewünschten Ergebnis - noch hilfreicher ein Skript um die Tabellen samt Inhalt mit einem Klick zu erzeugen.

TurboMagic 17. Nov 2023 23:36

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Gewünschte Beispielausgabe:

Code:
KASSENABSCHLUSS_NR SUM
0                   Null
1                   3.000
2                   -1.500
3                   Null
4                   5.000
Hab' leider diesen Tabelle Button noch nicht verstanden.
Der fügt leider keine Beispiel Zeilen Definition ein.

Tabellendefinition ggf. morgen.

Was aber rauskommen soll:

1. Jeweils eine Zeile pro KASSENABSCHLUSS_NR
2. Die enthält entweder Null, wenn es keine Belege mit einer Belegpos für die GV_TYP = 11 gibt
3. Oder falls es solche gibt die Summe dieser

Delphi.Narium 18. Nov 2023 02:00

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Das könnte durch das Tauschen der Tabellen und Weglassen der Wherebedingung funktionieren:
SQL-Code:
select
  pu.KASSENABSCHLUSS_NR,
  sum(case
        when p.GV_TYP = 11 then pu.POS_BRUTTO -- 3. Oder falls es solche gibt die Summe dieser
        else Null -- 2. Die enthält entweder Null, wenn es keine Belege mit einer Belegpos für die GV_TYP = 11 gibt
      end
     ) as Summe
from KASSE_BONPOS_UST pu
left join KASSE_BONPOS p
  on (pu.Z_KASSE_ID = 'MeineKasse') and
     (pu.KASSENABSCHLUSS_NR = p.KASSENABSCHLUSS_NR) and
     (pu.BON_ID = p.BON_ID)
group by pu.KASSENABSCHLUSS_NR -- 1. Jeweils eine Zeile pro KASSENABSCHLUSS_NR
order by pu.KASSENABSCHLUSS_NR

TurboMagic 18. Nov 2023 09:59

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Hallo,

danke für deine Antwort. Die werde ich irgendwann später heute ausprobieren
(jetzt ist erst Mal Gartenarbeit angesagt).

Durch deine Fallunterscheidung sieht die erst Mal sehr vielversprechend aus!

Grüße
TurboMagic

TurboMagic 18. Nov 2023 16:14

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Hallo,

erster Test sieht gut aus! Danke!

Grüße

TurboMagic

Redeemer 20. Nov 2023 11:10

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Aus einer der ersten Vorlesungen Informationssysteme: Man verwendet das (implizite) kartesische Produkt nicht.

(Außer man hat einen sehr guten Grund, kein JOIN zu verwenden.)

Das implizite kartesische Produkt ist das with...-do von SQL: Macht meist mehr Arbeit, als es einem abnimmt.

himitsu 20. Nov 2023 11:23

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Zitat:

Delphi-Quellcode:
from KASSE_BONPOS_UST pu, KASSE_BONPOS p

Fände es auch schön, wenn man diese grauenhaften impliziten AS deaktivieren könnte.

Ich hatte mal 'nen Fehler gesucht, wo einfach nur ein Komma fehlte und das DBMS sich dann dachte da einfach ein AS rein zu schieben.
Die fehlende Spalte war garnicht aufgefallen, aber wir wunderten uns, warum in der einen Spalte (Feld) Werte drin standen, die da nicht rein gehören.


* Also dieses implizite kartesische Produkt und die impliziten AS verbieten oder zumindestens eine Warnung werfen, würde viele potentielle Fehler verhindern.

Blup 22. Nov 2023 10:38

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Die Auswertung scheint sich auf eine ganz bestimmte Kasse zu beziehen.
Dann gehört (pu.Z_KASSE_ID = 'MeineKasse') in die where-Klausel.

Delphi.Narium 22. Nov 2023 11:45

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
so?
SQL-Code:
select
  pu.KASSENABSCHLUSS_NR,
  sum(case
        when p.GV_TYP = 11 then pu.POS_BRUTTO -- 3. Oder falls es solche gibt die Summe dieser
        else Null -- 2. Die enthält entweder Null, wenn es keine Belege mit einer Belegpos für die GV_TYP = 11 gibt
      end
     ) as Summe
from
(
  select
    KASSENABSCHLUSS_NR,
    BON_ID,
    POS_BRUTTO
  from KASSE_BONPOS_UST
  where pu.Z_KASSE_ID = 'MeineKasse' -- 0. Wir wollen nur diese Kasse auswerten, hier dürfte das Ergebnis genau ein Datensatz sein.
) pu
left join KASSE_BONPOS p
  on (pu.KASSENABSCHLUSS_NR = p.KASSENABSCHLUSS_NR) and
     (pu.BON_ID = p.BON_ID)
group by pu.KASSENABSCHLUSS_NR -- 1. Jeweils eine Zeile pro KASSENABSCHLUSS_NR
order by pu.KASSENABSCHLUSS_NR

Jumpy 22. Nov 2023 12:24

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1529925)
so?
SQL-Code:
select
  pu.KASSENABSCHLUSS_NR,
  sum(case
        when p.GV_TYP = 11 then pu.POS_BRUTTO -- 3. Oder falls es solche gibt die Summe dieser
        else Null -- 2. Die enthält entweder Null, wenn es keine Belege mit einer Belegpos für die GV_TYP = 11 gibt
      end
     ) as Summe
from
(
  select
    KASSENABSCHLUSS_NR,
    BON_ID,
    POS_BRUTTO
  from KASSE_BONPOS_UST
  where pu.Z_KASSE_ID = 'MeineKasse' -- 0. Wir wollen nur diese Kasse auswerten, hier dürfte das Ergebnis genau ein Datensatz sein.
) pu
left join KASSE_BONPOS p
  on (pu.KASSENABSCHLUSS_NR = p.KASSENABSCHLUSS_NR) and
     (pu.BON_ID = p.BON_ID)
group by pu.KASSENABSCHLUSS_NR -- 1. Jeweils eine Zeile pro KASSENABSCHLUSS_NR
order by pu.KASSENABSCHLUSS_NR

Das sollte nicht funktionieren, weil das pu. in der Where Klauses da innerhalb des Subselect nicht bekannt ist.

Delphi.Narium 22. Nov 2023 12:36

AW: Zwei Tabellen verknüpfen und summieren aber mit NULLs
 
Zitat:

Zitat von Jumpy (Beitrag 1529926)
Zitat:

Zitat von Delphi.Narium (Beitrag 1529925)
so?
SQL-Code:
select
  pu.KASSENABSCHLUSS_NR,
  sum(case
        when p.GV_TYP = 11 then pu.POS_BRUTTO -- 3. Oder falls es solche gibt die Summe dieser
        else Null -- 2. Die enthält entweder Null, wenn es keine Belege mit einer Belegpos für die GV_TYP = 11 gibt
      end
     ) as Summe
from
(
  select
    KASSENABSCHLUSS_NR,
    BON_ID,
    POS_BRUTTO
  from KASSE_BONPOS_UST
  where pu.Z_KASSE_ID = 'MeineKasse' -- 0. Wir wollen nur diese Kasse auswerten, hier dürfte das Ergebnis genau ein Datensatz sein.
) pu
left join KASSE_BONPOS p
  on (pu.KASSENABSCHLUSS_NR = p.KASSENABSCHLUSS_NR) and
     (pu.BON_ID = p.BON_ID)
group by pu.KASSENABSCHLUSS_NR -- 1. Jeweils eine Zeile pro KASSENABSCHLUSS_NR
order by pu.KASSENABSCHLUSS_NR

Das sollte nicht funktionieren, weil das pu. in der Where Klauses da innerhalb des Subselect nicht bekannt ist.

Du hast recht, da hab' ich was vergessen wegzumachen :-( (Copy&Paste sollte ich mir abgewöhnen ;-))
SQL-Code:
select
  pu.KASSENABSCHLUSS_NR,
  sum(case
        when p.GV_TYP = 11 then pu.POS_BRUTTO -- 3. Oder falls es solche gibt die Summe dieser
        else Null -- 2. Die enthält entweder Null, wenn es keine Belege mit einer Belegpos für die GV_TYP = 11 gibt
      end
     ) as Summe
from
(
  select
    KASSENABSCHLUSS_NR,
    BON_ID,
    POS_BRUTTO
  from KASSE_BONPOS_UST
  where Z_KASSE_ID = 'MeineKasse' -- 0. Wir wollen nur diese Kasse auswerten, hier dürfte das Ergebnis genau ein Datensatz sein.
) pu
left join KASSE_BONPOS p
  on (pu.KASSENABSCHLUSS_NR = p.KASSENABSCHLUSS_NR) and
     (pu.BON_ID = p.BON_ID)
group by pu.KASSENABSCHLUSS_NR -- 1. Jeweils eine Zeile pro KASSENABSCHLUSS_NR
order by pu.KASSENABSCHLUSS_NR
So besser?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.

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