【问题标题】:Count records per month with condition每月统计有条件的记录
【发布时间】:2020-05-04 15:54:47
【问题描述】:

我有一张桌子,我们叫他们SUMMARYDATA

NIP  NAME   DEPARTMENT       STATUSIN           STATUSOUT               LATECOME
------------------------------------------------------------------------------------------------
A1   ARIA   BB         2020-01-21 08:06:23  2020-01-21 11:58:36         00:06:23             
A1   ARIA   BB         2020-01-22 07:34:27  2020-01-22 17:19:47         00:00:00               
A1   ARIA   BB         2020-01-23 08:30:00  2020-01-23 11:00:00         00:30:00
A1   ARIA   BB         2020-01-24 08:05:00  2020-01-24 10:30:00         00:05:00
A2   BELLE  BB         2020-01-21 07:06:20  2020-01-21 13:58:31         00:00:00             
A2   BELLE  BB         2020-01-22 07:34:27  2020-01-22 17:19:47         00:00:00               
A2   BELLE  BB         2020-01-23 07:06:00  2020-01-23 10:30:00         00:00:00
A2   BELLE  BB         2020-01-24 09:06:00  2020-01-23 10:30:00         02:06:00
A3   CHLOE  CC         2020-01-21 07:06:23  2020-01-21 11:55:30         00:00:00             
A3   CHLOE  CC         2020-01-22 07:34:27  2020-01-22 17:00:44         00:00:00               
A3   CHLOE  CC         2020-01-23 08:37:00  2020-01-23 11:13:00         00:37:00
A3   CHLOE  CC         2020-01-24 08:09:00  2020-01-24 10:22:00         00:09:00
A4   ZIYA   CC         2020-01-21 07:06:20  2020-01-21 13:58:31         00:00:00             
A4   ZIYA   CC         2020-01-22 07:34:27  2020-01-22 17:19:47         00:00:00               
A4   ZIYA   CC         2020-01-23 06:06:00  2020-01-23 11:30:00         00:00:00
A4   ZIYA   CC         2020-01-24 09:06:00  2020-01-23 15:30:00         02:06:00
A5   BRIAN   BB         2020-01-21 08:06:23  2020-01-21 11:58:36         00:06:23             
A5   BRIAN   BB         2020-01-22 07:34:27  2020-01-22 17:19:47         00:00:00               
A5   BRIAN   BB         2020-01-23 08:30:00  2020-01-23 11:00:00         00:30:00
A5   BRIAN   BB         2020-01-24 08:05:00  2020-01-24 10:30:00         00:05:00

我需要SELECT(DEPARTMENT,MONTH,YEARS,COUNT(LATECOME))COUNT 每月记录Count (where LATECOME > '00:00:01') > 2

因为,Aria 和 Brian 每月有 LATECOME > 2,Belle 和 Ziya 每月只有 1 个 LATECOME,Chloe 只有 2 个 LATECOME。所以,在部门 BB 中只有 1 是 Aria,部门 CC 是 0,因为 Chloe 和 Ziya <= 2 LATECOME

这是我的意思的示例输出:

DEPARTMENT     MONTH    YEAR       LATECOME
-------------------------------------------
  BB            01      2020           2              
  CC            01      2020           0

【问题讨论】:

    标签: sql sql-server count


    【解决方案1】:

    尝试以下方法:

    ;WITH cte AS 
    (
        SELECT DISTINCT [NAME], DEPARTMENT, MONTH(STATUSIN) [MONTH], YEAR(STATUSIN) [YEAR], 
            SUM(CASE WHEN LATECOME = '00:00:00' THEN 0 ELSE 1 END) OVER(PARTITION BY [NAME], DEPARTMENT, MONTH(STATUSIN), YEAR(STATUSIN) ORDER BY [NAME]) Total
        FROM SUMMARYDATA
    )
    
    SELECT DEPARTMENT, [MONTH], [YEAR], SUM(CASE WHEN TOTAL > 2 THEN 1 ELSE 0 END) LATECOME
    FROM cte
    GROUP BY DEPARTMENT, [MONTH], [YEAR] 
    

    请找到 dbfiddle here

    【讨论】:

    • sacse 的方式比我的要好得多 :) - 我是老派 :(
    • @Srinika 每个正确输出的答案都是 gr8 \m/ :)。
    • 你的更简洁
    • 非常感谢您对我的帮助:) 它的工作.. 但是当我使用我的真实数据运行时.. 我在部门 BB 有 2 个人有 LATECOME > 2.. 为什么输出只显示1不是2? @sacse
    • 请检查我更新的问题以查看示例数据和输出。谢谢:) @sacse
    【解决方案2】:
    Create table #SUMMARYDATA(NIP varchar(10), NAME varchar(50),DEPARTMENT varchar(90),STATUSIN datetime, STATUSOUT datetime,LATECOME TIME(0))
    Insert into #SUMMARYDATA
    Values('A1','ARIA','BB','2020-01-21 08:06:23','2020-01-21 11:58:36','00:06:23'),             
    ('A1','ARIA','BB','2020-01-22 07:34:27','2020-01-22 17:19:47','00:00:00'),               
    ('A1','ARIA','BB','2020-01-23 08:30:00','2020-01-23 11:00:00','00:30:00'),
    ('A1','ARIA','BB','2020-01-24 08:05:00','2020-01-24 10:30:00','00:05:00'),
    ('A2','BELLE','BB','2020-01-21 07:06:20','2020-01-21 13:58:31','00:00:00'),            
    ('A2','BELLE','BB','2020-01-22 07:34:27','2020-01-22 17:19:47','00:00:00'),               
    ('A2','BELLE','BB','2020-01-23 07:06:00','2020-01-23 10:30:00','00:00:00'),
    ('A2','BELLE','BB','2020-01-24 09:06:00','2020-01-23 10:30:00','02:06:00'),
    ('A3','CHLOE','CC','2020-01-21 07:06:23','2020-01-21 11:55:30','00:00:00'),             
    ('A3','CHLOE','CC','2020-01-22 07:34:27','2020-01-22 17:00:44','00:00:00'),               
    ('A3','CHLOE','CC','2020-01-23 08:37:00','2020-01-23 11:13:00','00:37:00'),
    ('A3','CHLOE','CC','2020-01-24 08:09:00','2020-01-24 10:22:00','00:09:00'),
    ('A4','ZIYA','CC','2020-01-21 07:06:20','2020-01-21 13:58:31','00:00:00'),             
    ('A4','ZIYA','CC','2020-01-22 07:34:27','2020-01-22 17:19:47','00:00:00'),               
    ('A4','ZIYA','CC','2020-01-23 06:06:00','2020-01-23 11:30:00','00:00:00'),
    ('A4','ZIYA','CC','2020-01-24 09:06:00','2020-01-23 15:30:00','02:06:00')
    
    
    Select s.DEPARTMENT,Q.[Month],Q.[Year], 
        Case when Max(LateCount) > 2 then 1 Else 0 End as LateCome  
    from #SUMMARYDATA s 
    inner join 
    (
     SELECT NAME, MONTH(StatusIn) as [Month] , YEAR(StatusIn) as [Year], 
     Sum(Case when LateCome > '00:00:00' then 1 Else 0 End) as LateCount 
     from #SUMMARYDATA
     group by NAME,  MONTH(StatusIn), YEAR(StatusIn)
    ) Q 
    ON MONTH(s.StatusIn) = Q.[Month] and YEAR(s.StatusIn) =Q.[Year] and s.NAME = q.NAME
    group by  s.DEPARTMENT,Q.[Month],Q.[Year]
    

    --- 或者让它更优雅一点

    ;With sdCTE as
    (
     SELECT NAME, DEPARTMENT, MONTH(StatusIn) as [Month] , YEAR(StatusIn) as [Year],  
     Case when LateCome > '00:00:00' then 1 Else 0 End as LateCome 
     from #SUMMARYDATA
    )
    Select DEPARTMENT, [Month],[Year], 
        Case when Max(LateCount) > 2 then 1 Else 0 End as LateCome  
    from
    (
        select Name, DEPARTMENT, [Month],[Year], Sum(LateCome) LateCount  
        from sdCTE
        group by Name,DEPARTMENT, [Month],[Year]
    ) Q
    Group by DEPARTMENT, [Month],[Year]
    

    【讨论】:

    • 非常感谢您对我的帮助:) 它的工作.. 但是当我使用我的真实数据运行时.. 我在部门 BB 有 2 个人有 LATECOME > 2.. 为什么输出只显示 1 不显示 2?
    • 请检查我更新的问题以查看示例数据和输出。谢谢:)
    • 我做了,假设如果满足迟到条件,您需要 1 或 0。请检查我的新解决方案。
    【解决方案3】:

    这是为了改变需求

    ;With sdCTE as
    (
     SELECT NAME, DEPARTMENT, MONTH(StatusIn) as [Month] , YEAR(StatusIn) as [Year],  
     Case when LateCome > '00:00:00' then 1 Else 0 End as LateCome 
     from #SUMMARYDATA
    )
    
    Select DEPARTMENT, [Month],[Year], 
        Sum(Case when (LateCount) > 2 then 1 Else 0 End) as LateCome  
    from
    (
        select Name, DEPARTMENT, [Month],[Year], Sum(LateCome) LateCount  
        from sdCTE
        group by Name,DEPARTMENT, [Month],[Year]
    ) Q
    Group by DEPARTMENT, [Month],[Year]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多