Benjamin.: Mehrere Counts auf eine Tabelle inkl Gruppierung

Hallo,

ich versuche eine Tabelle mit mehreren Counts auszuwerten und zu gruppieren.

Tabelle sieht ungefähr so aus :

ID  | Name     | Schalter
1   |   A      |     j
2   |   B      |     j
3   |   C      |     n
4   |   B      |     j
5   |   A      |     n

Herauskommen soll dann :

Anzahl| Name | j | n
2     |   B  | 2 | 0
2     |   A  | 1 | 1
1     |   C  | 0 | 1

Um einfach die Anzahl und Name auszugeben, kann ich

select count(*) as Anzahl, Name from Table group by Name

Doch das Zählen des Schalters nach den 2 möglichkeiten fällt mir schwer.

select count(*) as Anzahl, Name, count(Schalter="j") as j, count(Schalter="n") as n from Table group by Name order by Anzahl desc, j desc, n

wäre mein Versuch gewesen.. klappt aber auch nicht so ganz.

Mit einem Subselect habe ich es auch schon probiert, aber dann greift die Gruppierung nicht.

Hat jemand eine fixe Idee?

Verwendet wird eine MySQL Datenbank in der Version 5.1.32.

Vielen Dank!

  1. Mit einem Self Join im Subselect hat es geklappt :)

    SELECT count( * ) AS Anzahl, Name, (SELECT count( * ) AS j FROM Table AS B WHERE B.Schalter = 'j' AND B.Name = table.Name) as j,  
    (SELECT count( * ) AS n FROM Table AS C WHERE C.schalter = 'n' AND C.Name = table.Name ) as n FROM table  
    GROUP BY Name ORDER BY Anzahl DESC, j desc, n
    
  2. Hallo Benjamin,

    ID  | Name     | Schalter
    1   |   A      |     j
    2   |   B      |     j
    3   |   C      |     n
    4   |   B      |     j
    5   |   A      |     n

    Herauskommen soll dann :

    Anzahl| Name | j | n
    2     |   B  | 2 | 0
    2     |   A  | 1 | 1
    1     |   C  | 0 | 1

    Du suchst eine Kreuztabelle. Schließlich werden aus den unterschiedlichen Werten in der Spalte Schalter Spaltenüberschriften.

    MySQL enthält keine eingebaute Unterstützung für Kreuztabellen, aber Dein Statement läßt sich analog zu meinen Beispielen in einem Archivbeitrag zusammensetzen:

    SELECT                     -- Gib mir  
        COUNT(Name) Anzahl,    -- die Anzahl des Auftretens des Namens  
        Name,                  -- sowie den Namen selbst  
        -- berücksichtige nur Zeilen mit dem Wert j in Schalter  
        -- und diese Zeilen möchtest Du zählen  
        -- und benenne diese Reihe j  
        COUNT(CASE WHEN Schalter = 'j' THEN Schalter ELSE NULL END) j,  
        -- analog für n  
        -- berücksichtige nur Zeilen mit dem Wert n in Schalter  
        -- und diese Zeilen möchtest Du ebenfalls zählen  
        -- und benenne diese Reihe n  
        COUNT(CASE WHEN Schalter = 'n' THEN Schalter ELSE NULL END) n  
    FROM  
        Tabelle  
    GROUP BY Name
    

    Freundliche Grüße

    Vinzenz