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 Abfrage mit Join und Anzahl

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Daywalker11, 20 April 2017.

  1. Daywalker11

    Daywalker11 Neuer Benutzer

    Hallo zusammen,

    ich habe noch keine große DB Erfahrung und haben nun die Herausforderung die ich euch gerne Anhand der Tabellen darstellen möchte:

    Tabelle 1:
    SachNummer; LieferantenNummer; LieferantenIndex; AmpelStatus
    S111; L331; A;3
    S112; L331; B; 2
    S113; L331; B; 2
    S114; L332; A; 2
    S115; L332; A; 1
    S116; L332; A; 0

    Die AmpelStati gehen von 0 bis 3

    Tabelle2:
    LieferantenNummer; Lieferatenindex; Name; Adresse
    L331; A; FirmaA; AdresseA
    L331; B; FirmaA; AdresseB
    L332; A; FirmaB; AdresseBA

    Ergebnistabelle:
    LieferatenNummer; Lieferantenindex; Name; Adresse; AmpelStatus=0; AmpelStatus =1; Ampelstatus=2; Ampelstatus=3;
    L331; A; FirmaA; AdresseA; 0; 0; 0; 0; 1
    L331; B; Firma A; AdresseB; 0; 0; 2; 0; 0
    L332; A; FirmaB; AdresseBA; 1; 1; 0; 0; 0


    In der Zieltabelle sollen also immer die Anzahl der Sachnummern in den einzelnen Ampelstati angegeben werden, welche den einzelnen Lieferanten und deren Standorten zugeordnet werden können.

    Wäre super wenn ihr mir weiterhelfen könntet
    Besten Dank und Grüße
    Chris
     
    Zuletzt bearbeitet: 20 April 2017
  2. akretschmer

    akretschmer Datenbank-Guru

    Ohne Kaffee ...
    Code:
    test=*# select * from t1;
      sn  |  ln  | li | status
    ------+------+----+--------
     s111 | l331 | a  |  3
     s112 | l331 | b  |  2
     s113 | l331 | b  |  2
     s114 | l332 | a  |  2
     s115 | l332 | a  |  1
     s116 | l332 | a  |  0
    (6 Zeilen)
    
    test=*# select * from t2;
      ln  | li |  name  |  adresse   
    ------+----+---------+------------
     l331 | a  | firma a | adresse s
     l331 | b  | firma a | adresse b
     l332 | a  | firma b | adresse ba
    (3 Zeilen)
    
    test=*# select t2.ln, t2.li, t2.name, t2.adresse, count(t1.status) filter (where t1.status = 0) as as0, count(t1.status) filter (where t1.status=1) as as1, count(t1.status) filter (where t1.status = 2) as as2, count(t1.status) filter (where t1.status=3) as as3 from t2 left join t1 on t2.ln=t1.ln group by 1,2,3,4 order by 1,2;
      ln  | li |  name  |  adresse  | as0 | as1 | as2 | as3
    ------+----+---------+------------+-----+-----+-----+-----
     l331 | a  | firma a | adresse s  |  0 |  0 |  2 |  1
     l331 | b  | firma a | adresse b  |  0 |  0 |  2 |  1
     l332 | a  | firma b | adresse ba |  1 |  1 |  1 |  0
    (3 Zeilen)
    
    test=*#
    
     
  3. ukulele

    ukulele Datenbank-Guru

    filter() kennt MSSQL nicht daher müsstest du es mit CASE machen:
    Code:
    SELECT   t2.ln,
         t2.li,
         t2.name,
         t2.adresse,
         sum(CASE WHEN t1.[status] = 0 THEN 1 ELSE 0 END) AS as0,
         sum(CASE WHEN t1.[status] = 1 THEN 1 ELSE 0 END) AS as1,
         sum(CASE WHEN t1.[status] = 2 THEN 1 ELSE 0 END) AS as2,
         sum(CASE WHEN t1.[status] = 3 THEN 1 ELSE 0 END) AS as3
    FROM   t2
    LEFT JOIN t1 ON t2.ln = t1.ln
    GROUP BY t2.ln,t2.li,t2.name,t2.adresse
    ORDER BY 1,2;
     
    Daywalker11 gefällt das.
  4. Daywalker11

    Daywalker11 Neuer Benutzer

    Hallo Ihr beiden, danke für eure schnelle Hilfe. Die Lösung von Ukulele funktioniert einwandfrei :)
    Mit der filter Funktion hat meine Anwendung leider auch Probleme gehabt... Aber trotzdem interessanter Ansatz.

    Grüße aus Stuttgart
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Ja, FILTER ist ein recht neuer SQL-Standard. Kann PostgreSQL und ??? (keine Ahnung, wer noch)
     
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