如何获得正确的订单?

时间:2017-05-18 09:43:38

标签: sql sql-server sql-order-by

我已经编写了查询以获取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;

4 个答案:

答案 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;