注文SQLの合計で月と年

私はストアドプロシージャを持っており、selectステートメントは:

SELECT     { fn MONTHNAME(OrderDate) } AS MonthName, YEAR(OrderDate) AS Year, SUM(TotalValue) AS Profits
FROM         [Order]
WHERE     (YEAR(OrderDate) = @year)
GROUP BY { fn MONTHNAME(OrderDate) }, YEAR(OrderDate)

これは毎月の合計を示します しかし、私は結果を次のように表示します。

April 2013 
February 2013 
January 2013 
June 2013 
March 2013 
May 2013 

そのような場合の解決策は何ですか?

8

7 答え

これを試して:

SELECT     { fn MONTHNAME(OrderDate) } AS MonthName, YEAR(OrderDate) AS Year, SUM(TotalValue) AS Profits
FROM         [Order]
WHERE     (YEAR(OrderDate) = @year)
GROUP BY { fn MONTHNAME(OrderDate) }, MONTH(OrderDate), YEAR(OrderDate)
order by Year(orderDate),month(OrderDate)

あなたが注文するフィールドをgroup by句に追加する必要があることに注意してください

8
追加された
おかげで素晴らしい作品:))完璧な
追加された 著者 Bruce,

最後に order by 句を使うべきだと思います

SELECT     { fn MONTHNAME(OrderDate) } AS MonthName, YEAR(OrderDate) AS Year, SUM(TotalValue) AS Profits
FROM         [Order]
WHERE     (YEAR(OrderDate) = @year)
GROUP BY { fn MONTHNAME(OrderDate) }, YEAR(OrderDate) 
ORDER BY { fn MONTH(OrderDate) }, YEAR(OrderDate)

または

あなたはこのようにすることができます

SELECT     CASE { fn MONTH(OrderDate) } 
            when 0 then 'JAN'
            when 1 then 'FEB'
            when 2 then 'MAR'
            when 3 then 'APR'
            when 4 then 'MAY'
            when 5 then 'JUN'
            when 6 then 'JUL'
            when 7 then 'AUG'
            when 8 then 'SEP'
            when 9 then 'OCT'
            when 10 then 'NOV'
            when 11 then 'DEC'
           END
      AS MonthName, YEAR(OrderDate) AS Year, SUM(TotalValue) AS Profits
    FROM         [Order]
    WHERE     (YEAR(OrderDate) = @year)
    GROUP BY { fn MONTH(OrderDate) }, YEAR(OrderDate) 
    ORDER BY { fn MONTH(OrderDate) }, YEAR(OrderDate)
1
追加された
私は私の質問を編集しました...今すぐチェックしてお知らせください
追加された 著者 Ravi,
今すぐ確認する......
追加された 著者 Ravi,
@ bruce何が起こったのですか、本当に答えを受け入れるのは混乱していますか? ? :D
追加された 著者 Ravi,
heheは申し訳ありません、私はそれが複数の答えを受け入れることができると思うウェブサイトで新しいです:)))thanks @jWeavers
追加された 著者 Bruce,
はいこれは素晴らしい解決策ですまた、多くの感謝:)
追加された 著者 Bruce,
このケースではありがとうございます。fn MONTH(OrderDate)はグループに含まれていないので、fn MONTHNAME(OrderDate)ではなく、それが正常ですが、数字ではなく月の名前を表示する必要があります。
追加された 著者 Bruce,
ありがとうが、申し訳ありませんが、私はこれを試して、同じ結果を4月と2月にも1月に与える.....
追加された 著者 Bruce,

1月、2月、3月に注文する場合は

SELECT 
  month(OrderDate) MonthName, 
  year(OrderDate) Year, 
  sum(TotalValue) Profits
FROM         
  [Order]
WHERE     
  month(OrderDate) = @year
ORDER BY 
  year(OrderDate), 
  month(OrderDate)
GROUP BY 
  year(OrderDate),
  month(OrderDate)
1
追加された
あなたは正しい - 私は元の間違ったコメントを削除した。ありがとう
追加された 著者 Ryan,
@Ryanあなたは SELECT の部分にそれを置く必要はありませんので、order by節を GROUP BY
追加された 著者 Bob Vale,
私はこれを試して、私はこのエラーが表示されます:列 "Order.OrderDate"は、集計関数またはGROUP BY句に含まれていないため、ORDER BY句で無効です。
追加された 著者 Bruce,
ありがとう、はいそれは動作し、このケース私の結果は月の番号を表示しない名前:)
追加された 著者 Bruce,
はい、それは大きな感謝ですRyan and Bruce
追加された 著者 Bruce,

ちょうど追加する

Order by max(OrderDate) 

最後に。

SELECT     { fn MONTHNAME(OrderDate) } AS MonthName, YEAR(OrderDate) AS Year,     SUM(TotalValue) AS Profits
FROM         [Order]
WHERE     (YEAR(OrderDate) = @year)
GROUP BY { fn MONTHNAME(OrderDate) }, YEAR(OrderDate)
Order by max(OrderDate) 

今、それがどのように動作するかについて:

月、年を別々に注文すると、アルファベット順(1月前の4月)に昇順になります。あなたが注文日付で注文した場合、idは月/年で注文された日付値に基づいて注文されます。

1
追加された
ありがとう、私の答えを更新.. ..
追加された 著者 user2407394,
それがあなたの目的を果たしているかどうか教えてください.. !!
追加された 著者 user2407394,
orderbyフィールドをgroup by句に入れる必要があるため、これは機能しません
追加された 著者 Bob Vale,
はい、ボブは言ったように、ありがとう、すべて:))
追加された 著者 Bruce,
ありがとう@ user2407394
追加された 著者 Bruce,
select 
cast(year(appointmentdate) as char(4))+''+ 
case when len(cast(month(appointmentdate)as char(2)))=1 
then '0'+cast(  month(appointmentdate) as char(2) ) else cast(month(appointmentdate) as char(2))end  as apporder
from timeslots  
group by appointmentdate
order by appOrder
0
追加された

以下のクエリを使用してください。

SELECT     { fn MONTHNAME(OrderDate) } AS MonthName, datepart(MM,OrderDate)                     AS Month, YEAR(OrderDate) AS Year, SUM(TotalValue) AS Profits
FROM         [Order]
WHERE     (YEAR(OrderDate) = @year)
GROUP BY { fn MONTHNAME(OrderDate) }, YEAR(OrderDate),     datepart(MM,**OrderDate**) 
ORDER BY datepart(MM,**OrderDate**)
0
追加された
こんにちは、OPがあなたの洞察を理解できるように少し答えを説明できますか?かなりお待ちください。
追加された 著者 bufh,

これを試して。それは完全に動作します。すでに年の値を入力していることに注意してください。一度に1年しか選択できないので、Yearを注文したりグループ化する必要はありません。したがって、余分なコードは必要ありません。

SELECT { fn MONTHNAME(OrderDate) } AS MonthName, SUM(TotalValue) AS Profits
FROM [Order]
WHERE (YEAR(OrderDate) = @year)
GROUP BY { fn MONTHNAME(OrderDate) }, DATEPART(M, OrderDate)
ORDER BY DATEPART(M, OrderDate)
0
追加された