当前位置: 首页 > 面试题库 >

SQL选择,按时间顺序缺少月份

邢飞雨
2023-03-14
问题内容

请注意,以下组的输出中缺少2015-022015-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)

问题答案:

如果您不希望超出结果的日期minmax日期,则可以执行以下操作:

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 )


 类似资料:
  • 问题内容: 如何使用月/年从表中获取记录?我有一张这样的桌子: 是项目的截止日期,我想要对应于月份/年份的记录,而不是完整的日期,我的意思是特定月份的记录。 我该如何在mysql中做到这一点? 问题答案: 只需使用MONTH()和YEAR()即可:

  • 问题内容: 我有类似的东西 如果我只是这样做,它将以ID升序返回行。有没有一种方法可以按照IN语句中给出的顺序取回行? 问题答案: 您应该使用“ ORDER BY FIELD”。因此,例如:

  • 问题内容: 我认为使用某种顺序才有意义。我想做的是在视图中包括该子句,以便该视图上的所有s都可以忽略它。但是,我担心该订单不一定会延续到,因为它没有指定订单。 是否存在一种情况,即视图指定的顺序不会反映在该视图上的select结果中(该视图中的order by子句除外)? 问题答案: 您不能指望没有显式子句的任何查询中的行顺序。如果查询有序视图,但没有包括子句,则如果它们的顺序正确,请感到惊喜,并

  • 问题内容: 我想根据或月份的月份选择行,如下所示: 但是我只在PostgreSQL中收到错误消息。 如何才能做到这一点? 问题答案: 您可以使用函数,如下所示: 您的问题来自PostgreSQL中没有诸如函数之类的事实。在此处查看在线文档,以了解可以得到什么。应该足够了。

  • 问题内容: 我在一个字段中有一个表格(其中包括日期)。 我需要获取所有列表的列表,这些列表比最早的日期更早,比最新的日期更早并且在表格中完全丢失。 因此,如果表包含: 我想要一个返回的查询: 问题答案: 这样的事情(假设您的表被命名,而date列被命名): 编辑: 该子句称为“公用表表达式”,等效于派生表(“内联视图”)。 类似于 第二个CTE使用Oracle实现中未记录的功能简单地“即时”创建日

  • 是否可以从TestNG中按时间顺序获得? 我的测试类和方法都显示得乱七八糟。 我知道按时间顺序排序,但我也希望emailable-report.html中有一个按时间顺序排列的视图