如何获得正确的顺序?

How to get the right order?

我已经编写了查询以获取 2016 年每个月的总数量。然后我添加了另一行名为 Total 来总结 2016 年的总数量。但是 ordermonth结果结果乱七八糟

所以,问题是有什么方法可以将 ordermonth 置于正确的顺序? ASCDESC 都可以。提前致谢。

我写的查询:

WITH CTE AS(
        SELECT CONVERT(CHAR(10), MONTH(orderdate)) AS ordermonth, SUM(qty) AS qty
        FROM dbo.orders
        WHERE YEAR(orderdate) = 2016
        GROUP BY MONTH(orderdate)
    )
SELECT * FROM CTE 

UNION

SELECT 'Total', SUM(qty)
FROM dbo.orders
WHERE YEAR(orderdate) = 2016;

当前结果:

ordermonth  qty
1           4134
10          6454
11          9780
12          4000
2           5548
3           6970
4           3543
5           3309
6           4251
7           4997
8           6134
9           6926
Total      66046

您可以按 yyyymm 排序,这是最好的方法,即使您有超过一年的时间,即

order by orderyear * 100 + ordermonth

或者您可以只添加“0”以获得正确的顺序,如下所示:

order by right('0' + cast(ordermonth as varchar(2)), 2)

首先,不用UNION也可以为所欲为。像这样:

select coalesce(cast(month(orderdate) as varchar(255)), 'Total') as mon . . .
from . . .
group by grouping sets (month(orderdate), ())
order by month(orderdate)

没有 CTE,这就是整个查询。

您可以放入子查询并尝试如下:

select * from (
 --your query including cte and union 
  ) a
  order by case when a.[Month] = 'Total' then 9999 else convert(int,a.[Month]) end

我找到了一个简单的方法来解决这个问题,那就是用 UNION ALL 替换 UNION。

WITH CTE AS(
        SELECT CONVERT(CHAR(10), MONTH(orderdate)) AS ordermonth, SUM(qty) AS qty
        FROM dbo.orders
        WHERE YEAR(orderdate) = 2016
        GROUP BY MONTH(orderdate)
    )
SELECT * FROM CTE 

UNION ALL

SELECT 'Total', SUM(qty)
FROM dbo.orders
WHERE YEAR(orderdate) = 2016;