我已经编写了查询以获取2016年每个月的总数量。然后我添加了另一行名为 Total 来总结2016年的总数量。但是 ordermonth 结果结果一团糟。
所以,问题是有没有办法按正确的顺序放置 ordermonth ? <nav class="navbar navbar-light bg-faded">
<a class="navbar-brand" href="#">My Brand</a>
<div class="mr-auto">
<a href=""><button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button></a>
</div>
</nav>
和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;
答案 0 :(得分:1)
首先,你可以在没有UNION
的情况下做你想做的事。像这样:
select coalesce(cast(month(orderdate) as varchar(255)), 'Total') as mon . . .
from . . .
group by grouping sets (month(orderdate), ())
order by month(orderdate)
没有CTE,这就是整个查询。
答案 1 :(得分:0)
你可以按yyyymm排序,这是最好的方式,即使你有一年以上的时间,即
order by orderyear * 100 + ordermonth
或者你可以添加&#39; 0&#39;为了得到这样的正确的顺序:
order by right('0' + cast(ordermonth as varchar(2)), 2)
答案 2 :(得分:0)
你可以放入子查询并尝试如下:
select * from (
--your query including cte and union
) a
order by case when a.[Month] = 'Total' then 9999 else convert(int,a.[Month]) end
答案 3 :(得分:0)
我找到了解决此问题的简便方法,即用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;