微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL select,pad按时间顺序丢失了几个月

请注意,sql在以下组的输出中缺少2015-02和2015-03个月.如果一个月没有数据,我想显示月份和0.任何人都知道如何去做这个?
SELECT convert(char(7),MeterReadDate,121),count(*)
FROM [myTable]
where (MeterReadDate > dateadd(d,-356,getdate()))
group by  convert(char(7),121)
order by  convert(char(7),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,count(*)

  FROM @TEMP m left join
     [myTable] t
     on convert(char(7),121) = convert(char(7),m.MeterReadDate,121)

  where (t.MeterReadDate > dateadd(m,getdate()))
  group by  convert(char(7),121)
  order by  convert(char(7),121)

解决方法

如果您不想超出结果的最短和最长日期,则可以执行以下操作:
WITH    cte
          AS ( SELECT convert(char(7),121) AS [Date],COUNT(*) AS [Count]
               FROM [myTable]
               WHERE (MeterReadDate > dateadd(d,getdate()))
               GROUP by  convert(char(7),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,calendar.mind),DATEADD(mm,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 )

原文地址:https://www.jb51.cc/mssql/83325.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐