请注意,以下组的输出中缺少2015-02和2015-03月份SQL。如果一个月没有数据,我想显示月份和0。有人知道该怎么做吗?
2015-02
2015-03
SQL
0
SELECT convert(char(7), MeterReadDate, 121),count(*) FROM [myTable] where (MeterReadDate > dateadd(d,-356,getdate())) group by convert(char(7), MeterReadDate, 121) order by convert(char(7), MeterReadDate, 121)
样本数据:
YYYY-MM COUNT 2014-06 23 2014-07 42 2014-08 80 2014-09 92 2014-10 232 2014-11 88 2014-12 8 2015-01 5 2015-04 2 2015-05 1
仍然无法清除丢失的行,这是我在其中的位置。
DECLARE @StartDate DATETIME = dateadd(m,-12,getdate()), @EndDate DATETIME = getdate(), @DATE DATETIME DECLARE @TEMP AS TABLE (MeterReadDate datetime) SET @DATE = @StartDate WHILE @DATE <= @EndDate BEGIN INSERT INTO @TEMP VALUES ( @DATE) SET @DATE = DATEADD(MONTH,1,@DATE) END SELECT convert(char(7), t.MeterReadDate, 121),count(*) FROM @TEMP m left join [myTable] t on convert(char(7), t.MeterReadDate, 121) = convert(char(7), m.MeterReadDate, 121) where (t.MeterReadDate > dateadd(m,-12,getdate())) group by convert(char(7), t.MeterReadDate, 121) order by convert(char(7), t.MeterReadDate, 121)
如果您不希望超出结果的日期min和max日期,则可以执行以下操作:
min
max
WITH cte AS ( SELECT convert(char(7), MeterReadDate, 121) AS [Date], COUNT(*) AS [Count] FROM [myTable] WHERE (MeterReadDate > dateadd(d,-356,getdate())) GROUP by convert(char(7), MeterReadDate, 121) ), minmax AS ( SELECT CAST(MIN([Date] + '-01') AS DATE) AS mind , CAST(MAX([Date] + '-01') AS DATE) maxd FROM cte ), calendar AS ( SELECT mind , CONVERT(CHAR(7), mind, 121) AS cmind FROM minmax UNION ALL SELECT DATEADD(mm, 1, calendar.mind) , CONVERT(CHAR(7), DATEADD(mm, 1, calendar.mind), 121) FROM calendar CROSS JOIN minmax WHERE calendar.mind < minmax.maxd ) SELECT c.cmind AS [Date], ISNULL(cte.[Count], 0) AS [Count] FROM calendar c LEFT JOIN cte ON c.cmind = cte.[Date] OPTION ( MAXRECURSION 0 )