[英]Count records per month with condition
我有一张桌子,我们称它们为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
。
这是样本 output 我的意思是:
DEPARTMENT MONTH YEAR LATECOME
-------------------------------------------
BB 01 2020 2
CC 01 2020 0
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]
尝试以下操作:
;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]
请在此处找到 db<>fiddle。
这是针对更改的要求
;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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.