安排1月至12月的月份订单。我怎样才能做到这一点?

时间:2017-03-03 12:50:57

标签: sql-server

我使用强制转换选项将日期转换为月份,并使用Distinct Keyword。现在我想安排从1月到12月的月订单。我怎么能这样做?

QUERY:

SELECT DISTINCT CAST(DATENAME(MONTH,INV_DATE) AS VARCHAR(12)) AS INV_DATE 
FROM AP_INVOICE_HEAD 
ORDER BY INV_DATE ASC

3 个答案:

答案 0 :(得分:1)

由于您使用的是DISTINCT关键字,因此必须使用select子句中的列对结果集进行排序。

简单的解决方案是将月份号添加到select子句中,然后在order by子句中使用它:

SELECT  DISTINCT CAST(DATENAME(MONTH,t.INV_DATE) AS VARCHAR(12)) AS INV_DATE, 
        DATEPART(MONTH, INV_DATE) As INT_Month
FROM AP_INVOICE_HEAD
ORDER BY INT_Month

另一个不涉及在选择列表中添加其他列的选项是将DISTINCT替换为GROUP BY

SELECT CAST(DATENAME(MONTH, INV_DATE) AS VARCHAR(12)) As INV_DATE
FROM AP_INVOICE_HEAD t
GROUP BY CAST(DATENAME(MONTH, INV_DATE) AS VARCHAR(12))
ORDER BY MAX(MONTH(t.INV_DATE)) 

注意:在order by子句中,INV_DATE引用表中的列,而不是select子句中的别名。
尽管此处不需要t.限定符,但它确实使查询更具可读性。

答案 1 :(得分:0)

要根据月份进行排序,您可以使用order by Month(date)

答案 2 :(得分:0)

您可以直接在INV_DATE使用order by,因为order by将在select语句后执行...

SELECT DISTINCT CAST(DATENAME(MONTH,INV_DATE) AS VARCHAR(12)) AS INV_DATE 
FROM AP_INVOICE_HEAD ORDER BY INV_DATE