tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
495
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    FlaverSaver Tutorials.de Gastzugang
    Hallo,

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

    Code :
    1
    2
    3
    
    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
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Du meinst sowas?
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    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)
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    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)
    Code sql:
    1
    
    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)
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
         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.
    Geändert von Yaslaw (27.09.10 um 16:16 Uhr)
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    FlaverSaver Tutorials.de Gastzugang
    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
     

Ähnliche Themen

  1. SQL Einträge aus verschiedenen Tabellen zählen auch null
    Von red2k im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 19.10.07, 19:39
  2. MySQL Einträge zählen
    Von MM2410 im Forum Relationale Datenbanksysteme
    Antworten: 6
    Letzter Beitrag: 31.03.05, 21:12
  3. Antworten: 3
    Letzter Beitrag: 26.11.04, 21:30
  4. Antworten: 2
    Letzter Beitrag: 22.01.04, 07:17
  5. Antworten: 3
    Letzter Beitrag: 28.11.02, 12:01