在SQL查询中排序月份名称

时间:2018-10-04 05:36:46

标签: sql sql-server sorting tsql

我当前的查询是:

SELECT FORMAT(Date, 'MMM') as 'Date', FORMAT(Date, 'yyy') as 'Year' 
,COUNT(*) 
as 'Tickets Generated'
FROM [SambaData2].[dbo].[Tickets]
GROUP BY FORMAT(Date, 'MMM'), FORMAT(Date, 'yyy')
ORDER BY Date

它返回值:

enter image description here

我希望同一个查询返回Year排序后的月份名称!

3 个答案:

答案 0 :(得分:2)

为了提高查询效率,我将避免使用format()方法。

select
       left(datename(month,[Date]),3) [Month]
     , year([Date]) [Year]
     , [Tickets Generated]
from (
        SELECT
               dateadd(month,datediff(month,0,t.[Date]),0) as [Date]
             , COUNT(*) as [Tickets Generated]
        FROM [SambaData2].[dbo].[Tickets] AS t
        GROUP BY dateadd(month,datediff(month,0,t.[Date]),0)
    ) as d
ORDER BY [Date]

此方法的核心如下:

dateadd(month,datediff(month,0,t.[Date]),0)

这具有定位相关年份和月份的第一天的作用,从而使整个日期都可用于order by子句,但仍分组为所需的级别。运行箔纸可能有助于解释

select 
  datediff(month,0,getdate()) a
, dateadd(month,datediff(month,0,getdate()),0) b
, left(datename(month,getdate()),3) c
, getdate() d


   a          b        c              d           
 ------- ------------ ----- --------------------- 
  1425    2018-10-01   Oct   2018-10-04 08:08:19     

答案 1 :(得分:1)

这是另一种选择:

SELECT
    FORMAT(Date, 'yyy') AS Year,
    FORMAT(Date, 'MMM') AS Date,
    COUNT(*) AS [Tickets Generated]
FROM [SambaData2].[dbo].[Tickets]
GROUP BY
    FORMAT(Date, 'yyy'),
    FORMAT(Date, 'MMM')
ORDER BY
    TRY_CONVERT(datetime, FORMAT(Date, 'yyy') + '-' + FORMAT(Date, 'MMM'));

与接受的答案相比,我更喜欢这种方法,因为它仅使用ORDER BY子句中实际存在的SELECT子句中的组件。某些RDBMS会抱怨ORDER BY使用了SELECT中不存在的组件。此答案还假定您的SQL Server版本支持TRY_CONVERT

答案 2 :(得分:0)

按以下顺序使用年(日期),月(日期) month()函数将为您提供月份号,以便您轻松订购

SELECT FORMAT(Date, 'MMM') as 'Date', FORMAT(Date, 'yyy') as 'Year',
COUNT(*) 
as 'Tickets Generated'
FROM [SambaData2].[dbo].[Tickets]
GROUP BY FORMAT(Date, 'MMM'), FORMAT(Date, 'yyy'),year(Date),month(Date)
ORDER BY year(Date),month(Date)