2013-06-24 171 views
6

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 

這種情況下的解決方案是什麼?

回答

4

試試這個:

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) 

注意,你需要通過子句添加您訂購由該組任何領域

+0

感謝,作品很好.. :))完美 – Bruce

1

我想你應該在年底

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) 
+0

感謝,但對不起,我嘗試這樣做,仍然給出相同的結果,然後四月二月一月..... – Bruce

+0

我已經編輯我的查詢......現在檢查,讓我知道 – Ravi

+0

感謝你在這種情況下,FN MONTH(OrderDate)不在組中,所以我有它,而不是FN MONTHNAME(OrderDate),這很好用,但是我需要顯示月份名稱不是數字.. – Bruce

1

如果你想訂購的一月,二月,三月的使用使用order by條款

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) 
+0

我試過這個,我得到這個錯誤:列「Order.OrderDate」在命令BY子句,因爲它不包含在聚合函數或GROUP BY子句中。 – Bruce

+0

謝謝,是的,它的工作原理和這種情況下,我的結果顯示月份編號不是名稱:) – Bruce

+0

@Ryan你不需要把它放在'SELECT'部分,你需要把任何按子句的順序放到'GROUP BY ' –

0

只需加上

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) 

現在它是如何工作:

如果按月訂購,一年分開,它會在一個月按字母順序排列的升序(一月前4月)。如果您通過訂購日期訂購,訂購ID將根據當然按月/年訂購的日期值進行訂購。

+0

讓我知道它是否符合您的目的。 – user2407394

+0

這不會工作,因爲orderby字段需要在組條件 –

+0

謝謝,更新我的答案..! – user2407394

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**) 
+1

嗨,你能解釋一點你的答案,所以OP可以理解你的見解?請稍等。 – bufh

0
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

試試這個。它完美的作品。請注意,您已經輸入年份值。所以你不需要訂購或組織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)