Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Aggregation über GROUP BY - "Leere Gruppen" anzeigen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von charY, 30 November 2016.

  1. charY

    charY Benutzer

    Ich versuche gerade eine Aggregation mittels GROUP BY bei der es darum geht auch leere Gruppen anzuzeigen.

    Szenario:

    Ich habe eine Tabelle in der ich eine Zuordnung vornehme, ich ordne einem item eine gruppe zu

    tbl_Item_Gruppe
    item_id, gruppe_id

    Eine weitere Tabelle die Informationen enthält über die Items
    tbl_Item
    item_id, datum, ....

    Nun möchte ich eine GROUP BY Aggregation über die Gruppe und das Datum haben


    D.h. eine Ausgabe über die Anzahl der Items pro Monat,

    Mit

    Code:
    SELECT
      DATE_FORMAT(datum, '%Y-%m') AS 'datum',
      gruppe_id,
      COUNT(*) AS 'anzahl'
    FROM tbl_Item
    LEFT JOIN tbl_Item_Gruppe ON (tbl_Item.item_id = tbl_Item_Gruppe.item_id)
    GROUP BY DATE_FORMAT(datum, '%Y-%m'), gruppe_id
    
    bekomme ich zwar die halbwegs gewünschte Aggregation, aber da ich nicht jeden Monat alle Gruppen "gefüllt" habe, bekomme ich nicht in jedem Monat die gleiche Anzahl an Gruppen-Item-Anzahl Zuweisungen. Weil die in denen der Count "0" ist natürlich raus fallen.

    Meine Frage ist nun wie ich das geschickt lösen kann.

    Dankeschön
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Mit einer Tabelle, die die betreffenden Monate enthält. In 'richtigen' Datenbanken (zu denen MySQL nicht gehört) hat man für sowas Funktionen wie generate_series():

    Code:
    test=*# select generate_series('2016-01-01'::date, '2016-12-02'::date, '1month'::interval)::date;
     generate_series
    -----------------
     2016-01-01
     2016-02-01
     2016-03-01
     2016-04-01
     2016-05-01
     2016-06-01
     2016-07-01
     2016-08-01
     2016-09-01
     2016-10-01
     2016-11-01
     2016-12-01
    (12 Zeilen)
    
    Da nun den anderen Krams dranjoinen und gut ist.
     
  3. ukulele

    ukulele Datenbank-Guru

    Du müsstest dir entweder wie schon erwähnt eine Basistabelle mit allen Datumswerten erstellen oder erzeugen. In diesem Fall könnte man etwas zurecht fuschen, etwa so:
    Code:
    SELECT
      t.datum,
      gruppe_id,
      COUNT(*) AS 'anzahl'
    FROM (
    SELECT t2.monat + ' ' + t1.jahr AS datum
    FROM ( SELECT DISTINCT DATE_FORMAT(datum,'%Y') AS jahr FROM tbl_Item ) t1
    CROSS JOIN ( SELECT DISTINCT DATE_FORMAT(datum,'%M') AS monat FROM tbl_Item ) t2
    ) t
    LEFT JOIN tbl_Item ON DATE_FORMAT(tbl_Item.datum, '%Y-%m') = t.datum
    LEFT JOIN tbl_Item_Gruppe ON (tbl_Item.item_id = tbl_Item_Gruppe.item_id)
    GROUP BY DATE_FORMAT(datum, '%Y-%m'), gruppe_id
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden