[mySQL 5] Zu den Monaten Einträge zählen und Monate ohne Einträge auch ausgeben.

F

FlaverSaver

Hallo,

ich habe eine SQL Abfrage, die mir aus einer Tabelle alle Monate mit der Anazhl der Einträge ausgibt.

Code:
SELECT DATE_FORMAT( datum, "%m.%Y" ) AS name, COUNT(MONTH(datum)) AS size
FROM tabelle
GROUP BY DATE_FORMAT( datum, "%Y%m" ) asc

Nun kann es ja vorkommen, das es zu einem Monat keine Einträge gibt. Nun möchte ich gerne das diese Monate auch ausgegebn werden, dann halt bei "size" 0.

Beispiel:
02.2010
03.2010
06.2010
08.2010

Somit fehlen vom ersten Monat bis 'jetzt' also 09.2010 folgende Monate:
04.2010
05.2010
07.2010
09.2010

Nun möchte ich aber eine Liste haben, in der alle Monate zusammen stehen. Bei den 'leeren' Monaten halt bei "size" 0.

Ist das irgendwie möglich, oder muss ich dafür etwas mit PHP basteln?

mfg
Philip
 
Du meinst sowas?
SQL:
SELECT
    month_year_string,
    COUNT(Datum) AS size
FROM
    (SELECT
        CONCAT(LPAD(node_month, 2, '0'), '.', node_year) AS month_year_string,
        CONCAT(node_year, LPAD(node_month, 2, '0')) AS group_by_string
    FROM
        (SELECT 1 AS node_month
        UNION SELECT 2
        UNION SELECT 3
        UNION SELECT 4
        UNION SELECT 5
        UNION SELECT 6
        UNION SELECT 7
        UNION SELECT 8
        UNION SELECT 9
        UNION SELECT 10
        UNION SELECT 11
        UNION SELECT 12) AS months_list, 
        (SELECT DISTINCT YEAR(Datum) AS node_year FROM tabelle) AS year_list ) AS month_year_list
    LEFT JOIN tabelle as my_dates
        ON month_year_list.group_by_string = DATE_FORMAT(my_dates.Datum, "%Y%m" )
GROUP BY group_by_string

Ich erstelle zuerst eine Monatsliste (month_list)
SQL:
SELECT 1 AS node_month
        UNION SELECT 2
        UNION SELECT 3
        UNION SELECT 4
        UNION SELECT 5
        UNION SELECT 6
        UNION SELECT 7
        UNION SELECT 8
        UNION SELECT 9
        UNION SELECT 10
        UNION SELECT 11
        UNION SELECT 12

Dann erstelle ich eine Liste mit allen Jhren die in der Tabelle vorhanden sind (year_list)
SQL:
SELECT DISTINCT YEAR(Datum) AS node_year FROM tabelle
Diese 2 kombiniere ich ohne Argumente. Ergo wird jede Kombination Monat-Jahr zusammengestellt. Aus dieser Kombination erstelle ich 2 Felder. Eines mit der Monats-Anzeige (month_year_string), das andere mit einem String den wir für den GROUP BY() und den ON-Teil des zukünftigen JOIN gebrauchen können (group_by_string)
SQL:
     SELECT
        CONCAT(LPAD(node_month, 2, '0'), '.', node_year) AS month_year_string,
        CONCAT(node_year, LPAD(node_month, 2, '0')) AS group_by_string
    FROM
        (SELECT 1 AS node_month
        UNION SELECT 2
        UNION SELECT 3
        UNION SELECT 4
        UNION SELECT 5
        UNION SELECT 6
        UNION SELECT 7
        UNION SELECT 8
        UNION SELECT 9
        UNION SELECT 10
        UNION SELECT 11
        UNION SELECT 12) AS months_list, 
        (SELECT DISTINCT YEAR(Datum) AS node_year FROM tabelle) AS year_list

Diese Datenmenge verknüpfe ich nun mit der Tabelle mittels eines LEFT_JOIN. Das ganze noch Gruppieren und den COUNT() auf ein Feld der Tabelle setzen, da diese bei keinen Einträgen auf NULL steht und NULL bei COUNT() nicht mitgezählt wird.
 
Zuletzt bearbeitet von einem Moderator:
Boa, der Wahnsinn!

Das gibts ja gar nicht. Da wäre ich echt im Leben nicht drauf gekommen!

Wahnsinn, ich bin echt begeistert!

Vielen Vielen Dank! :)

Philip
 
Zurück