Den Wert einer Spalte in zwei Spalten unterteilen.

mofo123

Benutzer
Beiträge
5
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?
 
Werbung:
klingt nach sum(case when .... then 1 else 0 end) as apfel..., kannst Du die Ausgangstabelle mal zeigen?

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.
 
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)
 
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)
 
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.
 
Werbung:
Zurück
Oben