【问题标题】:Query to return 24 hours and a month of hourly count even when no values exist查询返回 24 小时和一个月的小时计数,即使不存在值
【发布时间】:2018-08-15 10:40:27
【问题描述】:

我在下面有这些结果,我想要的只是那些没有计数的日子和记录。

谢谢下面是我使用的查询

SELECT dateadd(hour, datediff(hour, 0, date_sent_to_adobe), 0) as TimeStampHour, Count(*) 'Total Count this Hour' FROM [Publication_Data_Management].[AdobeExtract].[Membership_Detail] GROUP BY dateadd(hour, datediff(hour, 0, date_sent_to_adobe), 0) ORDER BY dateadd(hour, datediff(hour, 0, date_sent_to_adobe), 0) desc

是不是因为查询的编写方式只会显示表中的日期,我如何重写查询以显示每小时的日期,并显示没有记录计数的小时数。见附图。

我还想在不计算记录的情况下记录小时的记录。

【问题讨论】:

  • 您使用的是哪个 dbms?在日期/时间方面,许多产品远不符合 ANSI SQL。 (并且您的查询包含一些特定于产品的功能。)
  • 使用 dbms 2014
  • AFAIK 不存在称为 2014 的 DBMS。您的意思是 SQL Server 2014 可能吗?
  • 您正在选择截断为小时的 timstamps。因此,您的结果可能包含多天。这是期望的还是您实际上只想要聚合到 24 条记录,一天中的每个小时一个,无论日期如何?

标签: sql sql-server tsql


【解决方案1】:

为了显示所有小时数,您需要使用包含所有小时数的查找表执行JOIN

SELECT tt.Hours, COALESCE(a.Counts , 0) [Total Count this Hour] 
FROM
(
   VALUES (0), (1), ...(24)
)tt (Hours) LEFT JOIN (   
    SELECT 
       dateadd(hour, datediff(hour, 0, date_sent_to_adobe), 0) as TimeStampHour, 
       Count(*) Counts 
    FROM [Publication_Data_Management].[AdobeExtract].[Membership_Detail] 
    GROUP BY dateadd(hour, datediff(hour, 0, date_sent_to_adobe), 0) 
) a ON datepart(hour, a.TimeStampHour) = tt.Hours 

这假设您正在使用 SQL Server

【讨论】:

    【解决方案2】:

    如果要显示数据中没有的值,则需要生成另一个包含这些值的表集,然后执行LEFT JOIN。在以下 2 个示例中,我使用递归 CTE 在加入它们之前生成小时和月(您也可以使用显式 VALUES 表达式生成它们)。

    -- Hours
    ;WITH HoursCTE AS
    (
        SELECT
            Hour = 0
    
        UNION ALL
    
        SELECT
            Hour = C.Hour + 1
        FROM
            HoursCTE AS C
        WHERE
            C.Hour + 1 <= 23
    )
    SELECT
        H.Hour,
        COUNT(M.date_sent_to_adobe) 'Total Count this Hour' 
    FROM
        HoursCTE AS H
        LEFT JOIN [Publication_Data_Management].[AdobeExtract].[Membership_Detail] AS M ON
            H.Hour = DATEPART(HOUR, M.date_sent_to_adobe)
    GROUP BY
        H.Hour
    
    -- Months
    ;WITH MonthCTE AS
    (
        SELECT
            Month = 1
    
        UNION ALL
    
        SELECT
            Month = C.Month + 1
        FROM
            MonthCTE AS C
        WHERE
            C.Month + 1 <= 12
    )
    SELECT
        H.Month,
        COUNT(M.date_sent_to_adobe) 'Total Count this Month' 
    FROM
        MonthCTE AS H
        LEFT JOIN [Publication_Data_Management].[AdobeExtract].[Membership_Detail] AS M ON
            H.Month = DATEPART(MONTH, M.date_sent_to_adobe)
    GROUP BY
        H.MONTH
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2021-12-21
      相关资源
      最近更新 更多