suche Query, der eine bestimmte Datenanordnung liefert
Johnny B.
- datenbank
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
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
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
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
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
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!
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