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

Den Wert einer Spalte in zwei Spalten unterteilen.

Dieses Thema im Forum "Oracle" wurde erstellt von mofo123, 4 November 2015.

  1. mofo123

    mofo123 Benutzer

    Hallo zusammen,

    mich beschäftigt eine Abfrage so sehr, dass ich mich ergeben muss und nun Rat bei den Experten ersuche.
    Ich erkläre kurz theoretisch (und fiktional) mein Problem:
    Ich habe eine DB mit Ländern und Gemüse. Diese Länder erzeugen zwei Gemüsesorten (Äpfel und Birnen). Gut möglich, dass ein Land nur ein Gemüse erzeugt, aber maximal eben nur zwei bestimmte Sorten.

    Meine Abfrage sieht so aus:

    SELECT LTRIM(Land), COUNT(Gemüse)
    FROM gemuesedb.land
    GROUP by Land
    ORDER BY Land ASC;


    Mein Ergebnis:

    Land Gemuese
    Belgien 120
    Frankreich 80
    Deutschland 160
    Norwegen 95
    Russland 45
    Spanien 20




    Mein Problem:
    Ich würde gerne noch zwei Spalten hinzufügen. Diese Spalten heißen Äpfel und Birnen. Wie also kann ich die Gesamtzahl eines Landes in Äpfel und Birnen aufteilen und ausgeben?

    Land Gemuese Aepfel Birnen
    Belgien 120 60 60
    Frankreich 80 60 20
    Deutschland 160 100 60
    Norwegen 95 50 45
    usw.

    Entschuldigt bitte die Formatierung.

    Der Versuch zwei Abfragen mit Bedingung (where gemuese=apfel oder eben birnen) nacheinander laufen zu lassen, hat nicht funktioniert. Muss diese Art von Abfrage mit einer Verschachteltung gelöst werden?

    Hat jemand einen Tipp für mich?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    klingt nach sum(case when .... then 1 else 0 end) as apfel..., kannst Du die Ausgangstabelle mal zeigen?
     
  3. mofo123

    mofo123 Benutzer

    Vielen Dank für deine schnelle Antwort.

    Gerne doch:

    Land Gemuseart
    Belgien Apfel
    Norwegen Birne
    Russland Birne
    Spanien Apfel
    Norwegen Birne
    Deutschland Apfel
    Deutschland Birne
    Russland Birne
    Belgien Apfel
    Deutschland
    Spanien Apfel
    Norwegen Birne
    Deutschland Birne
    Belgien Apfel
    Spanien Apfel
    Deutschland Birne
    Spanien Apfel
    Belgien Birne

    Die Gesamtanzahl pro Land bekomme ich noch hin. Aber eben die Unterteilung in Äpfel und Birnen ist recht knifflig für mich.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from mofo ;
      land  | gemuese
    -------------+---------
     Belgien  | Apfel
     Norwegen  | Birne
     Russland  | Birne
     Spanien  | Apfel
     Norwegen  | Birne
     Deutschland | Apfel
     Deutschland | Birne
     Russland  | Birne
     Belgien  | Apfel
     Deutschland |
     Spanien  | Apfel
     Norwegen  | Birne
     Deutschland | Birne
     Belgien  | Apfel
     Spanien  | Apfel
     Deutschland | Birne
     Spanien  | Apfel
     Belgien  | Birne
    (18 rows)
    
    test=*# select land, count(*), count(1) filter (where gemuese = 'Apfel'), count(1) filter (where gemuese = 'Birne') from mofo group by land;
      land  | count | count | count
    -------------+-------+-------+-------
     Spanien  |  4 |  4 |  0
     Belgien  |  4 |  3 |  1
     Russland  |  2 |  0 |  2
     Deutschland |  5 |  1 |  3
     Norwegen  |  3 |  0 |  3
    (5 rows)
    
     
  5. akretschmer

    akretschmer Datenbank-Guru

    falls deine DB FILTER (...) nicht versteht:

    Code:
    test=*# select land, count(*), count(1) filter (where gemuese = 'Apfel') as apfel, sum(case when gemuese = 'Birne' then 1 else 0 end) as birne from mofo group by land;
      land  | count | apfel | birne
    -------------+-------+-------+-------
     Spanien  |  4 |  4 |  0
     Belgien  |  4 |  3 |  1
     Russland  |  2 |  0 |  2
     Deutschland |  5 |  1 |  3
     Norwegen  |  3 |  0 |  3
    (5 rows)
    
     
  6. mofo123

    mofo123 Benutzer

    Vielen Dank akretschmer,
    Oracle scheint filter nicht zu kennen. Du hast mich aber auf den richtigen Weg gebracht. Das ist nun meine Abfrage:

    select land,
    count(*),
    sum(case when gemuese='apfel' then 1 else 0 end) as apfel,
    sum(case when gemuese='birne' then 1 else 0 end) as birne
    from mofo
    group by land;


    Funktioniert einwandfrei.
    Nochmals vielen Dank.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Jupp. Kann wohl mal wieder nur PG, obwohl es meines Wissens nach in der SQL-Spec ist. Aber da ich das schohn ahnte, hatte ich das bei der Birnen-Spalte auch so gezeigt mit case ...
     
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