16

我有一个存储过程,选择语句是:

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

7 回答 7

17

尝试这个:

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 子句

于 2013-06-24T09:02:56.313 回答
4

只需添加

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 月到 1 月)。如果您按订单日期订购,则将根据日期值订购,该日期值当然按月/年订购。

于 2013-06-24T08:58:24.313 回答
2

我认为你应该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)
于 2013-06-24T08:47:56.920 回答
2

如果您想在 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)
于 2013-06-24T08:50:35.277 回答
1

使用以下查询它将为您工作。

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**)
于 2016-03-18T10:29:59.110 回答
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
于 2016-04-05T13:32:15.240 回答
0

尝试这个。它完美地工作。请注意,您已经输入了年份值。因此,您无需订购或分组年份,因为您一次只能选择一年。所以不需要额外的代码。

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)
于 2016-08-05T21:20:58.593 回答