2016-08-08 11 views
1

Guten Tag! Ich arbeite an einem Diagramm, in dem ich alle Monate in einem Jahr anzeigen muss, um die Verkäufe pro Monat anzuzeigen. Bisher kann ich nur den Monat anzeigen, in dem es entsprechende Werte gibt. Hier ist meine Stored Procedure-Abfrage bisher.Alle Monate anzeigen, auch wenn die Werte NULL sind

SELECT (DATENAME (MONTH, DATEADD (MONTH, DATEPART(MONTH, ORDER_DATE), -1))) 
AS MONTH_NAME, 
    SUM ([ORDER].NET_AMOUNT) AS TOTAL_SALES 
    FROM [ORDER], ORDER_DETAILS 
    WHERE [ORDER].ORDER_ID = ORDER_DETAILS.ORDER_ID 
    --AND (DATENAME (MONTH, DATEADD (MONTH, DATEPART(MONTH, ORDER_DATE), -1))) = (DATENAME (MONTH, DATEADD (MONTH, DATEPART(MONTH, @Order_month), -1))) 
    GROUP BY MONTH([ORDER].ORDER_DATE) 
    ORDER BY MONTH_NAME 

Es zeigt nur 1 Monat und die Verkäufe für diesen Monat. Kann mir jemand dabei helfen? Danke im Voraus!

+2

Wenn die fehlenden Monate nicht in Ihrem Dataset enthalten sind, müssen Sie diese Daten irgendwie einführen, möglicherweise mithilfe einer Kalendertabelle. –

+0

Ich werde daran arbeiten. Danke mein Herr! –

+3

Sight Umleitung ... Ihre Join-Syntax ist seit fast 30 Jahren nicht mehr aktuell. Es könnte Zeit sein, einen "moderneren" Join zu verwenden. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

Antwort

1

Zunächst verwenden die richtige bitte Syntax und Aliase JOIN.

Sie können CTE erstellen mit Monaten und CTE mit Ihrer Ausgabe und sich ihnen anzuschließen:

;WITH mcte AS (
    SELECT CAST('2016-01-01' as datetime) as MONTH_NAME 
    UNION ALL 
    SELECT DATEADD(MONTH,1,MONTH_NAME) 
    FROM mcte 
    WHERE DATEPART(MONTH,MONTH_NAME) < 12 
), octe AS (
    SELECT (DATENAME (MONTH, DATEADD (MONTH, DATEPART(MONTH, ORDER_DATE), -1))) AS MONTH_NAME, 
      SUM (o.NET_AMOUNT) AS TOTAL_SALES 
    FROM [ORDER] o 
    INNER JOIN ORDER_DETAILS od 
     ON o.ORDER_ID = od.ORDER_ID 
     --AND (DATENAME (MONTH, DATEADD (MONTH, DATEPART(MONTH, ORDER_DATE), -1))) = (DATENAME (MONTH, DATEADD (MONTH, DATEPART(MONTH, @Order_month), -1))) 
    GROUP BY MONTH(o.ORDER_DATE) 
) 


SELECT DATENAME(MONTH,m.MONTH_NAME) as MONTH_NAME, 
     o.TOTAL_SALES 
FROM mcte m 
LEFT JOIN octe o 
    ON o.MONTH_NAME = DATENAME(MONTH,m.MONTH_NAME) 

Damit werden alle Monatsnamen gab und alle Gesamtumsatz, wenn es keine Gesamtumsatz sind - wird es NULL-Werte zeigen.

+0

Hi @ gofr1! Ich habe ein Problem mit dieser Zeile ** m.DATENAME (MONTH, MONTH_NAME) **. Der Fehler sagt ** Kann Spalte "m" oder die benutzerdefinierte Funktion oder Aggregat "m.DATENAME" nicht finden, oder der Name ist mehrdeutig ** –

+0

Hi! Entschuldigung, es war mein Tippfehler. 'ON o.MONTH_NAME = m.DATENAME (MONTH, MONTH_NAME)' sollte "ON o.MONTH_NAME = DATENAME (MONTH, m.MONTH_NAME)" lauten, geändert in meiner Antwort! – gofr1

+0

Fügen Sie eine weitere Bearbeitung hinzu, jetzt sollte alles in Ordnung sein. :) – gofr1

0

Dieses Versuchen:

SELECT (DATENAME (MONTH, DATEADD (MONTH, DATEPART(MONTH, ORDER_DATE), -1))) 
AS MONTH_NAME, 
    SUM ([ORDER].NET_AMOUNT) AS TOTAL_SALES 
    FROM [ORDER], ORDER_DETAILS 
    WHERE [ORDER].ORDER_ID(+) = ORDER_DETAILS.ORDER_ID 
    --AND (DATENAME (MONTH, DATEADD (MONTH, DATEPART(MONTH, ORDER_DATE), -1)))   = (DATENAME (MONTH, DATEADD (MONTH, DATEPART(MONTH, @Order_month), -1))) 
    GROUP BY MONTH([ORDER].ORDER_DATE) 
    ORDER BY MONTH_NAME 
+0

Hallo! Ich habe es versucht, aber es sagt, ** Falsche Syntax in der Nähe von ')' ** Was ist das ** (+) ** für? –

+0

Sorry mein Fehler, es ist kein Orakel, Sie verwenden SQL-Server. Sie sollten die Antwort von #TheGameiswar verwenden – Curious

+0

Danke trotzdem! –

3

eine Tabelle von Monaten erstellen

Create table #months 
    (
    monthid int, 
    monthname varchar(100) 
    ) 

    insert into #monthids 
    (monthid,monthname) 
    values 
    (1,'January'),(2,'February')...insert upto 12 months 


;with cte 
as 
(
SELECT 
(DATENAME (MONTH, DATEADD (MONTH, DATEPART(MONTH, ORDER_DATE), -1))) 
AS MONTH_NAME, 
SUM ([ORDER].NET_AMOUNT) AS TOTAL_SALES 
FROM [ORDER], ORDER_DETAILS 
WHERE [ORDER].ORDER_ID = ORDER_DETAILS.ORDER_ID 
(DATENAME (MONTH, DATEADD (MONTH, DATEPART(MONTH, @Order_month), -1))) 
GROUP BY MONTH([ORDER].ORDER_DATE) 
) 
select 
m.Monthname, 
isnull(total_Sales,0) as 'totalSales' 
from #months m 
Left join 
cte c 
on c.monthname=m.month_name 
+0

Ist ** # Monate ** nur eine temporäre Tabelle? ja –

+0

, abhängig von Ihren Daten können Sie als permanente Tabelle erstellen sowie – TheGameiswar

+0

** wählt m.Monthname, isnull (total_sales, 0) als 'Totalsales' von #monthids CTE c auf c.monthname m = m.month_name ** Ich gebe das an eine JsonResult-Methode weiter, ich werde 3 Parameter wegen ** 'totalSales' ** übergeben haben? –

Verwandte Themen