Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

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

Dieses Thema im Forum "SQLite" wurde erstellt von TheDude69, 25 Juni 2014.

  1. TheDude69

    TheDude69 Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

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


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

    TheDude69 Benutzer

    ;)

    ... 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
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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)
    
     
  5. TheDude69

    TheDude69 Benutzer

    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
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Das Ergebniss.
     
  7. TheDude69

    TheDude69 Benutzer

    :)

    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
     
  8. akretschmer

    akretschmer Datenbank-Guru

    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.

    Wie üblich: im WHERE.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden