如何获得正确的顺序?
How to get the right order?
我已经编写了查询以获取 2016 年每个月的总数量。然后我添加了另一行名为 Total 来总结 2016 年的总数量。但是 ordermonth结果结果乱七八糟
所以,问题是有什么方法可以将 ordermonth 置于正确的顺序? ASC
和 DESC
都可以。提前致谢。
我写的查询:
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;
我已经编写了查询以获取 2016 年每个月的总数量。然后我添加了另一行名为 Total 来总结 2016 年的总数量。但是 ordermonth结果结果乱七八糟
所以,问题是有什么方法可以将 ordermonth 置于正确的顺序? ASC
和 DESC
都可以。提前致谢。
我写的查询:
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;