我当前的查询是:
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
它返回值:
我希望同一个查询返回Year排序后的月份名称!
答案 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)