Aggregation über GROUP BY - "Leere Gruppen" anzeigen

charY

Benutzer
Beiträge
5
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
 
Werbung:
Meine Frage ist nun wie ich das geschickt lösen kann.
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.
 
Werbung:
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
 
Zurück
Oben