【问题标题】:Select Date and Count, Group By Date -- How to show Dates with NULL Counts?选择日期和计数,按日期分组 -- 如何显示具有 NULL 计数的日期?
【发布时间】:2019-08-20 22:42:00
【问题描述】:
SELECT
    CAST(c.DT AS DATE) AS 'Date'
    , COUNT(p.PatternID) AS 'Count'
FROM CalendarMain c
LEFT OUTER JOIN Pattern p
    ON c.DT = p.PatternDate
INNER JOIN Result r
    ON p.PatternID = r.PatternID
INNER JOIN Detail d
    ON p.PatternID = d.PatternID
WHERE r.Type = 7
AND d.Panel = 501
AND CAST(c.DT AS DATE) 
    BETWEEN '20190101' AND '20190201'
GROUP BY CAST(c.DT AS DATE)
ORDER BY CAST(c.DT AS DATE)

上面的查询对我不起作用。它仍然会跳过 COUNT 为 NULL 的日子,因为它是 c.DT。

c.DT 和 p.PatternDate 都是时间 DateTime,尽管 c.DT 不能为 NULL。它实际上是桌子的PK。它填充为从 2015 年到 2049 年每一天的 DateTimes,因此存在那些日子的记录。

我注意到的另一件奇怪的事情是,当我加入 C.DT = p.PatternDate 而没有 CAST 或 CONVERT 到 Date 样式时,什么都没有返回。不知道为什么它们都是 DateTimes。

【问题讨论】:

    标签: tsql subquery distinct aggregate-functions


    【解决方案1】:

    这里有几件事要谈。在这个阶段还不清楚你实际上想要计算什么。如果是 2019 年 1 月每天的“模式”数量,那么:

    • 您的 BETWEEN 还将计算 2 月 1 日发生的任何活动,
    • 看起来一种模式可能有多个结果,可能会导致计数错误
    • 看起来一个模式可能有多个细节,可能会导致计数错误
    • 如果一个模式有 3 个符合条件的结果和 4 个详细信息,您将得到它们的叉积。您的计数将是 12。

    我假设:

    • 您只需要不同数量的模式,而不管细节和结果的数量。
    • 你只想要一月份的活动

    --Set up some dummy data

    DROP TABLE IF EXISTS #CalendarMain
    SELECT cast('20190101' as datetime) as DT
    INTO #CalendarMain
    UNION ALL SELECT '20190102' as DT
    UNION ALL SELECT '20190103' as DT
    UNION ALL SELECT '20190104' as DT
    UNION ALL SELECT '20190105' as DT  --etc etc
    ;
    
         DROP TABLE IF EXISTS #Pattern
       SELECT cast('1'as int)                         as PatternID
              ,cast('20190101 13:00' as datetime)     as PatternDate
         INTO #Pattern
    UNION ALL SELECT 2,'20190101 14:00'
    UNION ALL SELECT 3,'20190101 15:00'
    UNION ALL SELECT 4,'20190104 11:00'
    UNION ALL SELECT 5,'20190104 14:00'
    ;
    
         DROP TABLE IF EXISTS #Result
       SELECT cast(100 as int)                as ResultID
              ,cast(1 as int)                 as PatternID
              ,cast(7 as int)                 as [Type]
         INTO #Result
    UNION ALL SELECT 101,1,7
    UNION ALL SELECT 102,1,8
    UNION ALL SELECT 103,1,9
    UNION ALL SELECT 104,2,8
    UNION ALL SELECT 105,2,7
    UNION ALL SELECT 106,3,7
    UNION ALL SELECT 107,3,8
    UNION ALL SELECT 108,4,7
    UNION ALL SELECT 109,5,7
    UNION ALL SELECT 110,5,8
    ;
    
         DROP TABLE IF EXISTS #Detail
       SELECT cast(201 as int)                as DetailID
              ,cast(1 as int)                 as PatternID
              ,cast(501 as int)               as Panel
         INTO #Detail
    UNION ALL SELECT 202,1,502
    UNION ALL SELECT 203,1,503
    UNION ALL SELECT 204,1,502
    UNION ALL SELECT 205,1,502
    UNION ALL SELECT 206,1,502
    UNION ALL SELECT 207,2,502
    UNION ALL SELECT 208,2,503
    UNION ALL SELECT 209,2,502
    UNION ALL SELECT 210,4,502
    UNION ALL SELECT 211,4,501
    ;
           -- create some variables 
      DECLARE @start_date as date = '20190101';
      DECLARE @end_date   as date = '20190201'; --I assume this is an exclusive end date
    
       SELECT cal.DT
              ,isnull(patterns.[count],0) as [Count]
         FROM #CalendarMain cal
              LEFT JOIN (   SELECT cast(p.PatternDate as date)  as PatternDate
                                   ,COUNT(DISTINCT p.PatternID) as [Count]
                              FROM #Pattern     p
                                   JOIN #Result r ON p.PatternID = r.PatternID
                                   JOIN #Detail d ON p.PatternID = d.PatternID
                             WHERE r.[Type] = 7
                                   and d.Panel = 501
                          GROUP BY cast(p.PatternDate as date)
                        ) patterns ON cal.DT = patterns.patternDate
        WHERE cal.DT >= @start_date
              and cal.DT < @end_date  --Your code would have included 1 Feb, which I assume was unintentional.
     ORDER BY cal.DT
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 2011-07-21
      • 2014-11-06
      相关资源
      最近更新 更多