Johnny B.: suche Query, der eine bestimmte Datenanordnung liefert

Hallo geehrtes Forum,

ich habe eine Tabelle folgenden Formats:

id | datum      | typ | typ_id
----+------------+-----+--------
 21 | 2010-03-10 |  G  | 12
 22 | 2010-03-12 |  M  | 22

Jetzt suche ich einen mySQL-Query, mit dem ich die Anzahl der Einträge eines Typs gruppiert nach Monaten von einer typ_id bekomme. Das geht z.B. so:

SELECT  DATE_FORMAT( datum, '%m.%Y'),  
        COUNT(*),  
        typ  
FROM statistik  
WHERE typ_id = '$typ_id'  
GROUP BY YEAR( datum ), MONTH( datum ), typ ORDER BY datum  

Das Ergebnis sieht so aus:

datum  | anzahl | typ
--------+--------+-----
01.2010 | 1      | G
02.2010 | 1      | M
02.2010 | 1      | G
03.2010 | 1      | M
03.2010 | 13     | G

Das sind prinzipiell auch genau die Daten, die ich mit der Abfrage bekommen wollte. Ich erstelle die Tabelle mit dem Perl-Modul Data::Table. Das ist deswegen cool, weil ich dem Modul einfach ein Query übergebe und die Tabelle fertig zurückbekomme. Meine Herausforderung ist nun, ein Query zu formulieren, welches die Daten in folgender Form erzeugt:

datum  | G  | M | F | L | usw...
--------+----+----
01.2010 | 1  | 0
02.2010 | 1  | 1
03.2010 | 13 | 1

Ich kann natürlich in Perl etwas programmieren, was diese Anordnung mit mehreren Querys erzeugt. Bisher habe ich mySQL immer nur als bessere Wahl gegenüber Speicherung reiner .csv-Textdateien gesehen und benutzt. Aber u.a. durch Vinzenz Mai's Monster-Query hier hab ich jetzt Blut geleckt, mich in mySQL zu vertiefen. Was es da nicht alles gibt: JOINs, UNIONs, SUBSELECTs, sogar selfJOINs! ;-) Irgendwas von denen wird mir bestimmt auch hier helfen?! Kann mir jemand einen Tipp geben?

Besten Gruß
JOhnnY

  1. Hallo,

    ich habe eine Tabelle folgenden Formats:

    id | datum      | typ | typ_id
    ----+------------+-----+--------
    21 | 2010-03-10 |  G  | 12
    22 | 2010-03-12 |  M  | 22

    Meine Herausforderung ist nun, ein Query zu formulieren, welches die Daten in folgender Form erzeugt:

    datum  | G  | M | F | L | usw...
    --------+----+----
    01.2010 | 1  | 0
    02.2010 | 1  | 1
    03.2010 | 13 | 1

    wenn aus Datenwerten Spaltenüberschriften werden, nennt man das eine Kreuztabelle. MS SQL Server (ab 2005) und MS Access können das nativ. MySQL kann es nicht.

    Aber u.a. durch Vinzenz Mai's Monster-Query hier hab ich jetzt Blut geleckt, mich in mySQL zu vertiefen.

    Schön, wenn ich was bewirken konnte.
    Lesetipps für Dein Problem:

    </archiv/2008/6/t173119/#m1136008>
    </archiv/2009/3/t184124/#m1220523>

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz,

      Lesetipps für Dein Problem:

      </archiv/2008/6/t173119/#m1136008>
      </archiv/2009/3/t184124/#m1220523>

      soweit sogut. Nur wie kriege ich in diese Geschichte einen Zähler eingebaut? So jedenfalls nicht:

      SELECT  DATE_FORMAT( datum, '%m.%Y'),  
              MAX(CASE WHEN typ = 'G' THEN 1 ELSE NULL END) g  
      FROM statistik  
      WHERE typ_id = '$typ_id'  
      GROUP BY YEAR( datum ), MONTH( datum ) ORDER BY datum  
      

      und so auch nicht:

      SELECT  DATE_FORMAT( datum, '%m.%Y'),  
              MAX(CASE WHEN typ = 'G' THEN g=g+1 ELSE NULL END) g  
      FROM statistik  
      WHERE typ_id = '$typ_id'  
      GROUP BY YEAR( datum ), MONTH( datum ) ORDER BY datum  
      

      Besten Gruß
      JOhnnY

      1. soweit sogut. Nur wie kriege ich in diese Geschichte einen Zähler eingebaut?

        So geht's:

        SELECT  DATE_FORMAT( datum, '%m.%Y'),  
                COUNT(CASE  
                    WHEN typ = 'G'  
                    THEN 1  
                    ELSE NULL END  
                    ) G,  
                COUNT(CASE  
                    WHEN typ = 'M'  
                    THEN 1  
                    ELSE NULL END  
                    ) M  
        FROM statistik  
        WHERE typ_id = '$typ_id'  
        GROUP BY YEAR( datum ), MONTH( datum ) ORDER BY datum 
        

        So langsam find ich mySQL ja richtig cool! Macht Spaß! Vielen Dank!

        Glückliche Grüße
        JOhnnY

        1. moin,

          So langsam find ich mySQL ja richtig cool! Macht Spaß! Vielen Dank!

          und ich ärger mich immer wieder über mysql, zu mindestens was gruppierungen betrifft. deine abfrage würde bei jedem anderem dbms eine fehlermeldung ausgeben und das zurecht.

          Ilja

          1. Hi!

            und ich ärger mich immer wieder über mysql, zu mindestens was gruppierungen betrifft. deine abfrage würde bei jedem anderem dbms eine fehlermeldung ausgeben und das zurecht.

            Ja, aber schau mal, das was da an nicht aggregierten Inhalten angezeigt werden soll, ist doch völlig eindeutig. In diesem Fall ist es so, dass über genau die Informationen gruppiert wird, die in der SELECT-Klausel zu stehen kommen, nur dass die Form eine andere ist.

            Lo!

            1. moin,

              In diesem Fall ist es so, dass über genau die Informationen gruppiert wird, die in der SELECT-Klausel zu stehen kommen, nur dass die Form eine andere ist.

              die form kann doch durchaus eine andere gruppierung bewirken. woher soll das DBMS dass den wissen ? es bleibt dabei, niemals etwas ausgeben, was nicht auch in der GROUP BY klausel ganz genau so steht, es sei den, man benutzt aggregat-funktionen.

              Ilja