2016-08-08 6 views
1

おはよう!私は毎月の売り上げを表示するために1年にすべての月を表示する必要があるグラフを作成しています。これまでは、対応する値がある月のみを表示することができました。ここまでは、私のストアドプロシージャのクエリです。値がNULLの場合でもすべての月を表示する

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 

これは、その月の売上高とその月のみを表示します。誰かが私にこれを助けることができますか?ありがとうございました!

+2

欠落した月があなたのデータセットの一部でない場合は、何らかの形でカレンダーテーブルを使用してそのデータを導入する必要があります。 –

+0

私はそれについて作業します。ありがとうございます! –

+3

視力の迂回路...あなたの結合構文は30年近くも古くなっています。より「モダンな」スタイルの結合を使用することを考慮する時間がかかるかもしれません。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

答えて

1

を構文とエイリアスを登録しよう適切な使用してください。

あなたの出力と月とCTEとのCTEを作成し、それらを結合することができます何の総売上高がない場合

;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) 

この意志は、すべての月名とすべての総売上を与えた - それはNULLを表示します。

+0

こんにちは@ gofr1!この行に問題があります** m.DATENAME(MONTH、MONTH_NAME)**。エラーが表示されます**列 "m"またはユーザー定義関数または集計 "m.DATENAME"を見つけることができません、または名前があいまいです** –

+0

こんにちは!申し訳ありません、それは私のタイプミスでした。 'ON.MONTH_NAME = m.DATENAME(MONTH、MONTH_NAME) 'は' ON o.MONTH_NAME = DATENAME(MONTH、m.MONTH_NAME) 'にする必要があります。 – gofr1

+0

もう1つ編集を追加すると、すべてがうまくいくはずです。 :) – gofr1

0

はこれを試してみてください:まず

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

こんにちは!私はこれを試しましたが、それは言う、**不適切な構文 ')' ** **(+)**は何ですか? –

+0

申し訳ありませんが私の間違い、そのオラクル、あなたはSQL Serverを使用しています。あなたは#TheGameiswarの答え – Curious

+0

を使用してくださいありがとうとにかく! –

3

ヶ月のテーブルを作成します

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

**#ヶ月**は単なる一時テーブルですか? –

+0

はい、あなたのデータに応じて、あなたにも永久テーブルとして作成することができます – TheGameiswar

+0

** m.Monthnameを選択し、 ISNULL(TOTAL_SALES、0)#monthidsから 'totalSales' がc.monthnameに CTEのC をMと= m.month_name ** これをJsonResultメソッドに渡していますが、** 'totalSales' **のために3つのパラメータを渡しますか? –

関連する問題