Group By mit Nullwerten ausgeben

kspiel

Grünschnabel
Hallo alle zusammen,

Ich habe zwei Tabellen, in der einen sind Reisedaten enthalten, und die andere besitzt Reservierungsdaten. Ich möchte nun eine Ausgabe für einen Chart erstellen. Für den Graph möchte ich mir Daten wie Reservierungsanzahl und Einnahmen ziehen, und zwar nach Monaten gruppiert.

Das Problem ist nun, da ich nach Monaten gruppiere, werden Monate ohne einer Reservierung und Einnahmen durch die GROUP BY gefiltert/nicht angezeigt.

Wie kann ich die "leeren" Monate doch noch anzeigen? Denn es ist visuel nicht berauschend, wenn dem Mai der August folgt.

Benutz wird SQL 2008.

Meine aktuelle Abfrage lautet:
PHP:
SELECT      CONVERT(varchar(3), DATENAME(month, AbreiseDatum), 100) AS Monat,
		COUNT(ReisePositionenID) AS Reservierungen,
		SUM(ReisePositionenPreis) AS Einnahmen
		
FROM	tblReisePositionen

LEFT JOIN tblReise
ON tblReisePositionen.ReisePositionenReiseID = tblReise.ReiseID

WHERE YEAR(AbreiseDatum) = 2010

GROUP BY CONVERT(varchar(3), DATENAME(month, AbreiseDatum), 100), MONTH(AbreiseDatum)

ORDER BY MONTH(AbreiseDatum)

Ausgabebeispiel:
PHP:
Monat	Reservierungen	Einnahmen
Jan	        4	                640,00
Feb	        3	                540,00
Mär	        3	                450,00
Apr	        8	                2400,00
Mai	        2	                320,00
Aug	       13	                2695,00
Sep	        5	                900,00
Nov	        4	                1400,00
Dez	        3	                480,00

Hat für den Fall jemand vlt eine Idee?
 
Gibts keinen Befehl um NULL in was Sinnvolles zu wandeln? In Oracle gibt den Befehl NVL
 
Also ich würde eine Hilfstabelle erstellen, in den alle 12 Monate enthalten sind und dann Original-SELECT UNION SELECT Hilfstabelle machen. Dann müssten die fehlenden Monate nachgetragen werden, weil UNION dafür sorgt, dass keine doppelten Einträge eingefügt werden.

Code:
SELECT DATENAME(month, AbreiseDatum) AS Monat, COUNT(ReisePositionenID) AS Reservierungen from TabelleSowieso GROUP BY Monat
UNION SELECT monat, 0 from Hilfstabelle group by monat
order by monat asc
 
Zuletzt bearbeitet:
Das sieht schon mal viel besser aus, aber noch nicht wie es sein soll. In der Ausgabe finden sich noch doppelte Einträge

Code:
Monat	Reservierungen	Einnahmen
Apr	0	0,00
Apr	8	2400,00
Aug	0	0,00
Aug	13	2695,00
Dez	0	0,00
Dez	3	480,00
Feb	0	0,00
Feb	3	540,00
Jan	0	0,00
Jan	4	640,00
Jul	0	0,00
Jun	0	0,00
Mai	0	0,00
Mai	2	320,00
Mär	0	0,00
Mär	3	450,00
Nov	0	0,00
Nov	4	1400,00
Okt	0	0,00
Sep	0	0,00
Sep	5	900,00

Das aktuelle Statement:
Code:
SELECT	CONVERT(varchar(3), DATENAME(month,AbreiseDatum), 100) AS Monat,
		COUNT(ReisePositionenID) AS Reservierungen,
		ISNULL(SUM(ReisePositionenPreis), 0) AS Einnahmen
		
FROM	tblReisePositionen

LEFT JOIN tblReise
ON tblReisePositionen.ReisePositionenReiseID = tblReise.ReiseID

WHERE YEAR(AbreiseDatum) = 2010

GROUP BY CONVERT(varchar(3), DATENAME(month,AbreiseDatum), 100)

UNION

SELECT Monate, 0, 0
FROM tblMonate
GROUP BY Monat

Was mach ich noch falsch?
 
Zuletzt bearbeitet:
Aber wenn ich nur mit dem LEft JOIN versuche bekomme ich:

Code:
Monat	Reservierungen	Einnahmen
Apr	8	2400,00
Aug	13	2695,00
Dez	3	480,00
Feb	3	540,00
Jan	4	640,00
Mai	2	320,00
Mär	3	450,00
Nov	4	1400,00
Sep	5	900,00

Bei
Code:
SELECT	CONVERT(varchar(3), DATENAME(month,AbreiseDatum), 100) AS Monat,
		COUNT(ReisePositionenID) AS Reservierungen,
		ISNULL(SUM(ReisePositionenPreis), 0) AS Einnahmen
		
FROM	tblReisePositionen

LEFT JOIN tblReise
ON tblReisePositionen.ReisePositionenReiseID = tblReise.ReiseID

LEFT JOIN tblMonate
ON CONVERT(varchar(3), DATENAME(month,AbreiseDatum), 100) = tblMonate.Monat

WHERE YEAR(AbreiseDatum) = 2010

GROUP BY CONVERT(varchar(3), DATENAME(month,AbreiseDatum), 100)
 
Umgekehrt. Die Monatstabelle ist der Haubt-Auslöser
Ich geh mal davon aus, dass MS SQL auch Unterabfragen und Aliase kennt. Dann könnte es etwa so aussehen
SQL:
SELECT
    m.Monate,
    Reservierungen,
    Einnahmen,
FROM
    tblMonate AS m
    LEFT JOIN (
                SELECT    
                    CONVERT(varchar(3), DATENAME(month,AbreiseDatum), 100) AS Monat,
                    COUNT(ReisePositionenID) AS Reservierungen,
                    ISNULL(SUM(ReisePositionenPreis), 0) AS Einnahmen
                FROM    
                    tblReisePositionen
                LEFT JOIN tblReise
                ON tblReisePositionen.ReisePositionenReiseID = tblReise.ReiseID
                WHERE YEAR(AbreiseDatum) = 2010
                GROUP BY CONVERT(varchar(3), DATENAME(month,AbreiseDatum), 100)
                ) AS d
    ON m.Monate = d.Monat
 
Zuletzt bearbeitet von einem Moderator:
Hat super geklappt
Besten Dank :)

Code:
Monat	Reservierungen	Einnahmen
Jan	4	640,00
Feb	3	540,00
Mär	3	450,00
Apr	8	2400,00
Mai	2	320,00
Jun	NULL	NULL
Jul	NULL	NULL
Aug	13	2695,00
Sep	5	900,00
Okt	NULL	NULL
Nov	4	1400,00
Dez	3	480,00

Nun ersetze ich gleich noch die NULL werte und dann passt das.
 

Neue Beiträge

Zurück