thorsten: mySQL-Abfrage

Hallo,

ich habe eine Tabelle, die wie folgt aussieht:

| Titel | Geschlecht | | Dr. | männlich | Dipl. | weiblich | Prof. | weiblich | ... | ...

Ich bin auf der Suche nach einer Abfrage, die daraus folgende Tabelle erzeugt:

Titel | Anzahl gesamt | Anzahl männlich | Anzahl weiblich Dr. | 17 | 8 | 9 Dipl. | 22 | 12 | 10 Prof. | 13 | 6 | 7 ... | ... | ... | ...

Hat jemand einen Tip, wie die Abfrage ungefähr aussehen muss?

Viele Grüße Thorsten

  1. Tach!

    Ich bin auf der Suche nach einer Abfrage, die daraus folgende Tabelle erzeugt:

    Titel | Anzahl gesamt | Anzahl männlich | Anzahl weiblich Dr. | 17 | 8 | 9 Dipl. | 22 | 12 | 10 Prof. | 13 | 6 | 7 ... | ... | ... | ...

    Hat jemand einen Tip, wie die Abfrage ungefähr aussehen muss?

    Ich würde versuchen, über den Titel zu gruppieren, dann kannst du mit COUNT(*) schonmal die Gesamtanzahl ermitteln. Für die beiden anderen Teilmengen würde ich je eine Correlated Subquery mit ins SELECT setzen.

    dedlfix.

  2. Was Du da machst, ist eine Pivot-Abfrage.

    Auf Stackoverflow ist das schon öfter debattiert worden, klicke hier für einen beispielhaften Thread dazu.

    Offen ist immer, ob man eine Pivotisierung effizienter im SQL oder im hostenden Code macht. Wenn die Zähler groß werden, würde ich eine Pivotisierung im Server bevorzugen, um die übertragene Datenmenge vom Server zur Application klein zu halten.

    Eine direkte SQL Syntax zur Pivotisierung gibt's jedenfalls noch nicht. Nur Workarounds mit Subqueries oder COUNT(CASE...) Konstrukten.

    Rolf

  3. Hallo,

    ich habe jetzt folgende Lösung:

    SELECT r.name AS 'Titel', count(*) AS 'Anfragen insgesamt',
    SUM(
            CASE 
                WHEN r.gender='0' 
                THEN 1 
                ELSE 0 
            END
        ) AS 'Geschlecht männlich',
    SUM(
            CASE 
                WHEN r.gender='1' 
                THEN 1 
                ELSE 0 
            END
        ) AS 'Geschlecht weiblich'
        
    FROM
    requests AS r
    GROUP BY r.name
    

    Besten Dank an alle!