Ergebnisse nach mehreren Kriterien sortieren

Nuggme

Benutzer
Beiträge
7
Liebe Leute,

folgendes Problem: ich habe eine Tabelle, in der in der ersten Spalte ein Name, in der zweiten Spalte eine Abteilung und in der dritten Spalte jeweils eine Farbe eingetragen werden:

Name: Abt: Farbe:
David 1 gelb
Sarah 1 rot
Thomas 3 gelb
Michi 2 rot



Ich möchte nun gerne wissen, in welcher Abteilung wie viele Leute für die Farben gestimmt haben, das Ergebnis soll also so ausgegeben werden:

gelb: rot:
1: 1 1
2: 0 1
3: 1 0


Da ich noch relativ neu im Umgang mit SQL bin, weiß ich nicht wie ich das am effizientesten hinbekomme! Mein etwas kläglicher Ansatz wäre:

select count(Name)


from testtable


group by Farbe;


Wahrscheinlich ist das echt easy, aber ich kriegs nicht mit einer Abfrage hin...

Nuggme
 
Werbung:
Also da gibt es zwei Möglichkeiten wie das Ergebnis aussieht. Die erste wäre vom Code her die einfachere nämlich mit GROUP BY:
Code:
SELECT Abt,Farbe,count(*) AS Anzahl FROM tabelle GROUP BY Abt,Farbe ORDER BY Abt,count(*) DESC
Das Ergebnis sieht dann allerdings nicht wie gewünscht aus sondern hat pro Farbe eine Zeile. Wenn das Ergebnis zwigend den Inhalt der Spalte, also die Farbe, zu einer eigenen Spalte machen soll gibt es dafür Ansätze z.B. mit PIVOT oder mit mehreren Joins oder mit CASE-Anweisungen, abhängig von der Anzahl der möglichen Werte (Farben). Am einfachsten wäre in deinem Beispiel:
Code:
SELECT Abt,sum(CASE WHEN Farbe = 'rot' THEN 1 ELSE 0 END) AS Rot,,sum(CASE WHEN Farbe = 'gelb' THEN 1 ELSE 0 END) AS Gelb FROM tabelle GROUP BY Abt ORDER BY Abt
Das berücksichtigt jetzt aber erstmal nur zwei Farben.
 
Code:
test=*# select * from nuggme ;
  name  | abt | farbe
--------+-----+-------
 david  |  1 | gelb
 sarah  |  1 | rot
 thomas |  3 | gelb
 michi  |  2 | rot
(4 Zeilen)

test=*# select abt, count(1) filter (where farbe = 'gelb') as gelb, count(1) filter (where farbe = 'rot') as rot from nuggme group by abt;
 abt | gelb | rot
-----+------+-----
  1 |  1 |  1
  3 |  1 |  0
  2 |  0 |  1
(3 Zeilen)

test=*# select abt, sum(1) filter (where farbe = 'gelb') as gelb, sum(1) filter (where farbe = 'rot') as rot from nuggme group by abt;
 abt | gelb | rot
-----+------+-----
  1 |  1 |  1
  3 |  1 |   
  2 |  |  1
(3 Zeilen)
 
Werbung:
Zurück
Oben