Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [Firebird]Daten aus zwei Tabellen zählen (https://www.delphipraxis.net/22072-%5Bfirebird%5Ddaten-aus-zwei-tabellen-zaehlen.html)

MrSpock 12. Mai 2004 07:36


[Firebird]Daten aus zwei Tabellen zählen
 
Hallo SQL-Experten,

ich habe zwei einfache Tabellen T1 und T2, die nur je 3 Felder haben:

KNR - INTEGER
LFD - INTEGER
WOCHE - VARCHAR(10)

Beide haben dieselbe Struktur. Für jeden Kunden (KNR) kann es beliebig viele Einträge in beide Tabellen geben. Diese möchte ich jetzt für eine bestimmte Woche zählen. Dazu habe ich folgendes SQL Statement geschrieben:

SQL-Code:
SELECT KNR, COUNT(KNR) as ANZ, 'K1' as VON FROM tab1
WHERE WOCHE='20/04'
GROUP BY KNR
UNION
SELECT KNR, COUNT(KNR) as ANZ, 'K2' as VON FROM tab2
WHERE WOCHE='20/04'
GROUP BY KNR
Das funktioniert auch, aber ich möchte das Ergebnis gerne in folgender Form:

Code:
KNR  ANZ_IN_T1    ANZ_IN_T2
============================
1        2             3
2        0             2
3        4             0
Bekommt jemand das mit einem SQL Statement hin?

Ich habe es schon mit folgendem Statemet versucht:
SQL-Code:
SELECT T1.KNR, COUNT(T1.KNR), COUNT(T2.KNR) as ANZ FROM tab1 T1
FULL OUTER JOIN tab2 T2 ON T1.KNR=T2.KNR
WHERE T1.WOCHE='20/04' AND T2.WOCHE='20/04'
GROUP BY T1.KNR
aber obwohl ich einen FULL OUTER JOIN habe, erscheint nur der Kunde, der in beiden Tabellen vorkommt.

Lemmy 12. Mai 2004 11:35

Re: [Firebird]Daten aus zwei Tabellen zählen
 
Hi MrSpock,

so geht's zumindest etwas besser:

SQL-Code:
SELECT T1.KNR, COUNT(T1.KNR), COUNT(T2.KNR) as ANZ FROM t1 T1
full outer JOIN t2 T2 ON T1.KNR=T2.KNR
WHERE T1.WOCHE='20/04'
GROUP BY T1.KNR
Allerdings kommen dann nur die Kunden, die in der Tabelle 1 stehen! Wenn ein Kunde nur in Tabelle 2 steht erscheint der nicht! WEnn Du die Where-Bedingung weglässt, dann kommt auch der, allerdings ohne KNR (Da die KNR von Tabelle 1 ausgegeben wird, in der der Kunde aber nicht steht!)

Selbst der Weg über ne SP bringt nicht wirklich viel. Eine Lösung wäre dann möglich, wenn Du ausschließen kannst, dass in beiden Tabellen Kunden sind, die in der jeweils anderen Tabelle nciht enthalten sind, sprich: wenn in einer Tabelle alle möglichen Kunden stehen funzt das mit dem oberen SQL-Statement....

Grüße
Lemmy

sepp001 12. Mai 2004 11:35

Re: [Firebird]Daten aus zwei Tabellen zählen
 
Zitat:

Zitat von MrSpock
SQL-Code:
FULL OUTER JOIN tab2 T2 ON T1.KNR=T2.KNR

Hallo,

sagt nicht gerade diese Zeile aus, dass die Kundennummer in beiden Tabellen vorkommen muss?

Ciao,
sepp001

MrSpock 12. Mai 2004 12:24

Re: [Firebird]Daten aus zwei Tabellen zählen
 
Hallo sepp001,

nein, denn FULL OUTER JOIN ist im Grunde eine Zusammenfassung von LEFT OUTER und RIGHT OUTER JOIN, und das heißt, dass auch Datensätze in dem JOIN enthalten sind, für die es keine passenden KNR in der jeweils anderen Tabelle gibt. Ich habe mittlerweile eine Lösung, die genügend schnell ist, aber letztlich auf 3 Abfragen beruht. Ich glaube mit nur einer Abfrage geht es nicht, lasse mich aber gerne eines Besseren belehren :mrgreen:.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:52 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