SQL Statement zum Bilden einer Summe aus gefundenen Datensätzen zweier Tabellen

TheDude69

Benutzer
Beiträge
8
Hallo Zusammen,

ich habe eine Tabelle A mit nachfolgendem Aufbau: IDX (Prim. Key)|IDX_SW|IDX_B
... und eine Tabelle B wie folgt: IDX (Prim. Key)|Status|ScanDate

Der Schlüssel, dessen Treffer ich summieren möchte, hat den Wert 27. Die zugehörige Spalte in Tabelle A ist IDX_SW.

Das Feld IDX_B in der Tabelle A verweist auf den Primärschlüssel IDX in der Tabelle B.

Nun kann ich natürlich mit select count(*) from A where IDX_SW = '27'; mir die Summe aller Datensätze in Tabelle A mit dem Wert 27 im Feld IDX_SW anzeigen lassen. Allerdings hätte ich gerne die Summe für die Datensätze gebildet, bei denen:

1) Tabelle A, Feld IDX_SW = '27'
2) Tabelle B, Feld Status = 'L'

... ist.

Geht das überhaupt? Und wenn ja, wie wäre das Statement dazu?

Sorry für diese evtl. banale Frage, aber ich bin hier mit meiner "Weisheit" wirklich am Ende ... :(

Danke vorab für eure Hilfe,
viele Grüße

TheDude
 
Werbung:
Nun kann ich natürlich mit select count(*) from A where IDX_SW = '27'; mir die Summe aller Datensätze in Tabelle A mit dem Wert 27 im Feld IDX_SW anzeigen lassen.

Nein. Die Anzahl. Count() ist die Anzahl, Sum() die Summe. Merken!

Allerdings hätte ich gerne die Summe für die Datensätze gebildet, bei denen:

1) Tabelle A, Feld IDX_SW = '27'
2) Tabelle B, Feld Status = 'L'

... ist.

Geht das überhaupt? Und wenn ja, wie wäre das Statement dazu?


Mit viel Magie und einem JOIN geht das, ja. Reicht Dir das? Das ist wirklich nicht allzu schwer, gib Dir Mühe ;-)
 
;)

... habe mal weiter dran rumgeschraubt und ich glaube, daß es so geht:

select count(*) from A join B on A.IDX_B = B.IDX where A.IDX_SW = '27' and B.Status = 'L';

Als Ergebnis erhalte ich '5'. Allerdings muß ich nun erst einmal schauen, ob das sein kann ... die beiden Tabellen sind ziemlich groß.

Was hälst Du von diesem Statement? Ist es "gutes" SQL und zudem evtl. auch "richtig"? :confused:

Danke vorab & viele Grüße
TheDude

P. S. Ja, ich meinte Anzahl, nicht Summe, sorry! :D
 
;)

... habe mal weiter dran rumgeschraubt und ich glaube, daß es so geht:

select count(*) from A join B on A.IDX_B = B.IDX where A.IDX_SW = '27' and B.Status = 'L';

Als Ergebnis erhalte ich '5'. Allerdings muß ich nun erst einmal schauen, ob das sein kann ... die beiden Tabellen sind ziemlich groß.

Was hälst Du von diesem Statement? Ist es "gutes" SQL und zudem evtl. auch "richtig"? :confused:

Danke vorab & viele Grüße
TheDude

P. S. Ja, ich meinte Anzahl, nicht Summe, sorry! :D

Wird schon. Was soll passieren, wenn es in B Datensätze gibt, die nicht A.IDX_B = B.IDX erfüllen, aber den Status 'L' haben?

Möglicherweise willst Du einen LEFT JOIN, prüfe selber:

Code:
test=*# select * from master;
 id
----
  1
  2
  3
(3 rows)

test=*# select * from slave;
 id_m
------
  3
(1 row)

test=*# select * from master join slave on master.id=slave.id_m;
 id | id_m
----+------
  3 |  3
(1 row)

test=*# select * from master left join slave on master.id=slave.id_m;
 id | id_m
----+------
  3 |  3
  2 |
  1 |
(3 rows)
 
Hi,

... :)

Ich muß ja gestehen, daß ich leider mit Deinen "Ausführungen" zum Left Join nicht so viel anfangen kann. Ich bin, was SQL angeht, wirklich ein echter Anfänger.

Mein Statement hatte ich mir auf Basis der Informationen von http://de.wikibooks.org/wiki/Einführung_in_SQL:_Arbeiten_mit_JOIN erstellt - leider ohne richtig zu verstehen, was genau da passiert. :(

Insofern - ja, möglicherweise ein Left Join. Aber was ist da anders als bei meinem Statement? Wäre das mit einem Left Join schneller/besser/eleganter? :confused:

Danke vorab & viele Grüße
TheDude
 
:)

Umgewandelt bringt mir select count(*) from master join slave on master.id=slave.id_m; 67400 Treffer
... wohingegen mir select count(*) from master left join slave on master.id=slave.id_m; 67412 Treffer

Strange ... :confused: Muß mich noch mal etwas intensiver mit den Joins befasse, fürchte ich.

Wo kann ich hier denn die beiden Bedingungen '27' und 'L' unterbringen?

Viele Grüße
TheDude
 
Werbung:
:)

Umgewandelt bringt mir select count(*) from master join slave on master.id=slave.id_m; 67400 Treffer
... wohingegen mir select count(*) from master left join slave on master.id=slave.id_m; 67412 Treffer

Strange ... :confused: Muß mich noch mal etwas intensiver mit den Joins befasse, fürchte ich.

Der erste Join ist einklich ein INNER JOIN und prüft, daß auf beiden Seiten der Wert ist. Beim LEFT JOIN taucht die linke Tabelle aber komplett in Result auf, da von rechts nix ist ist dann leer.

Wo kann ich hier denn die beiden Bedingungen '27' und 'L' unterbringen?

Viele Grüße
TheDude

Wie üblich: im WHERE.
 
Zurück
Oben