【问题标题】:Sort Month Name in SQL Query在 SQL 查询中对月份名称进行排序
【发布时间】:2019-03-09 10:19:36
【问题描述】:

我当前的查询是:

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

它返回值:

我希望相同的查询返回带有年份的排序月份名称!

【问题讨论】:

  • 您使用的是哪个 dbms? (该查询是特定于产品的。)

标签: sql sql-server sorting tsql


【解决方案1】:

为了提高查询效率,我会避免使用 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 子句留下一个完整的日期,但仍分组到所需的级别。运行following可能有助于解释

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     

【讨论】:

  • 是的。按格式化数据分组是无稽之谈。分组后格式化数据。
【解决方案2】:

这是另一种选择:

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

【讨论】:

    【解决方案3】:

    按年(日)、月(日)的顺序使用 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)
    

    【讨论】:

    • 完成!在 Group by 中添加了相同的 Order by 子句,它可以工作!谢谢! @fa06
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    相关资源
    最近更新 更多