SQL - 按日期分组防止重复
SQL - Group by Date prevent duplicates
我正在尝试创建 运行 每月员工总数的月和年总数。
我有以下内容:
- 日期:
TCTIMESTAP 如果为空 GOLIVEDATE。来自 EE 的 TCTIME 和来自 SC 的 GOLIVEDATE。
- 员工身份 ID:
ID 表示我需要包含在计数中的状态。
我只想按 日期
对计数进行分组
举个例子table:
日期|公司编号 | Total_Employees
30 / 09 / 2021 76 169
30 / 09 / 2021 79 285
31 / 08 / 2021 79 280
31 / 08 / 2021 76 162
31 / 07 / 2021 79 272
31 / 07 / 2021 76 148
30 / 06 / 2021 79 266
30 / 06 / 2021 76 139
预期的结果应该是
日期 | Total_Employees
2021 年 9 月 30 日 454
2021 年 8 月 31 日 442
2021 年 7 月 31 日 420
2021 年 6 月 30 日 405
但是如果您从 where 子句中删除 CompanyId 以查看每个客户(大约 2000 个),它会将总和乘以它在 EE 中出现的次数、SC、RegisteredUserID 和 EmployeeStatusID
到目前为止我的代码
Select
Dates2,
sum(TE) over (Order by Dates2)
from (
SELECT
ISNULL(EOMONTH(ER.TCTimestamp),EOMONTH(SC.GoLiveDate)) as Dates2,
EE.CompanyId,
Name,
sum(case when EmployeeStatusId = '0' or EmployeeStatusId ='1' or EmployeeStatusId ='2' then 1 else 0 end) as TE
from D.Employee EE
Inner JOIN SuperAdmin.Customer AS SC on SC.CompanyId = EE.CompanyId
Left Join D.RegisteredUser AS ER on EE.RegisteredUserId = ER.RegisteredUserId
WHERE SC.CompanyId = 76 or SC.CompanyId = 79
GROUP BY
ISNULL(EOMONTH(ER.TCTimestamp),EOMONTH(SC.GoLiveDate)),
EE.CompanyId,
Name) as A
GROUP BY Dates2, te
order by Dates2 desc
添加了一个测试用例。请使用显示您不喜欢的行为的数据更新此信息。注明预期结果:
关于感兴趣的列的含义确实不够详细。但是,假设您真的想每天计算这些案例,以下内容将 GROUP BY
逻辑更正为每天聚合,并相应地调整 SUM
逻辑:
这是另一个猜测,如果您真的想单独计算 TE
组,然后在每个日期执行 运行 SUM
之前汇总每个日期的组。请原谅任何错别字。我没有你的测试表。
猜测 2:
SELECT Dates2
, SUM(SUM(TE2)) OVER (Order by Dates2)
FROM (
SELECT Dates2
, SUM(TE) AS TE2
FROM (
SELECT ISNULL(EOMONTH(ER.TCTimestamp), EOMONTH(SC.GoLiveDate)) AS Dates2
, EE.CompanyId
, Name
, SUM(CASE WHEN EmployeeStatusId IN ('0', '1', '2') THEN 1 ELSE 0 END) AS TE
FROM D.Employee EE
JOIN SuperAdmin.Customer AS SC
ON SC.CompanyId = EE.CompanyId
LEFT JOIN D.RegisteredUser AS ER
ON EE.RegisteredUserId = ER.RegisteredUserId
WHERE SC.CompanyId IN (76, 79)
GROUP BY ISNULL(EOMONTH(ER.TCTimestamp), EOMONTH(SC.GoLiveDate))
, EE.CompanyId
, Name
) AS A
GROUP BY Dates2, TE
) AS t1
GROUP BY Dates2
ORDER BY Dates2 desc
;
猜一:
SELECT Dates2
, SUM(SUM(TE)) OVER (Order by Dates2)
FROM (
SELECT ISNULL(EOMONTH(ER.TCTimestamp), EOMONTH(SC.GoLiveDate)) AS Dates2
, EE.CompanyId
, Name
, SUM(CASE WHEN EmployeeStatusId IN ('0', '1', '2') THEN 1 ELSE 0 END) AS TE
FROM D.Employee EE
JOIN SuperAdmin.Customer AS SC
ON SC.CompanyId = EE.CompanyId
LEFT JOIN D.RegisteredUser AS ER
ON EE.RegisteredUserId = ER.RegisteredUserId
WHERE SC.CompanyId IN (76, 79)
GROUP BY ISNULL(EOMONTH(ER.TCTimestamp), EOMONTH(SC.GoLiveDate))
, EE.CompanyId
, Name
) AS A
GROUP BY Dates2
ORDER BY Dates2 desc
;
如果这不是您想要的,请提供有关状态列和 date/timestamp 列含义的更多详细信息。
另外,还有一个细节可能需要解决。活跃客户可以变得不活跃吗?
我正在尝试创建 运行 每月员工总数的月和年总数。
我有以下内容:
- 日期:
TCTIMESTAP 如果为空 GOLIVEDATE。来自 EE 的 TCTIME 和来自 SC 的 GOLIVEDATE。 - 员工身份 ID:
ID 表示我需要包含在计数中的状态。
我只想按 日期
对计数进行分组举个例子table:
日期|公司编号 | Total_Employees
30 / 09 / 2021 76 169
30 / 09 / 2021 79 285
31 / 08 / 2021 79 280
31 / 08 / 2021 76 162
31 / 07 / 2021 79 272
31 / 07 / 2021 76 148
30 / 06 / 2021 79 266
30 / 06 / 2021 76 139
预期的结果应该是
日期 | Total_Employees
2021 年 9 月 30 日 454
2021 年 8 月 31 日 442
2021 年 7 月 31 日 420
2021 年 6 月 30 日 405
但是如果您从 where 子句中删除 CompanyId 以查看每个客户(大约 2000 个),它会将总和乘以它在 EE 中出现的次数、SC、RegisteredUserID 和 EmployeeStatusID
到目前为止我的代码
Select
Dates2,
sum(TE) over (Order by Dates2)
from (
SELECT
ISNULL(EOMONTH(ER.TCTimestamp),EOMONTH(SC.GoLiveDate)) as Dates2,
EE.CompanyId,
Name,
sum(case when EmployeeStatusId = '0' or EmployeeStatusId ='1' or EmployeeStatusId ='2' then 1 else 0 end) as TE
from D.Employee EE
Inner JOIN SuperAdmin.Customer AS SC on SC.CompanyId = EE.CompanyId
Left Join D.RegisteredUser AS ER on EE.RegisteredUserId = ER.RegisteredUserId
WHERE SC.CompanyId = 76 or SC.CompanyId = 79
GROUP BY
ISNULL(EOMONTH(ER.TCTimestamp),EOMONTH(SC.GoLiveDate)),
EE.CompanyId,
Name) as A
GROUP BY Dates2, te
order by Dates2 desc
添加了一个测试用例。请使用显示您不喜欢的行为的数据更新此信息。注明预期结果:
关于感兴趣的列的含义确实不够详细。但是,假设您真的想每天计算这些案例,以下内容将 GROUP BY
逻辑更正为每天聚合,并相应地调整 SUM
逻辑:
这是另一个猜测,如果您真的想单独计算 TE
组,然后在每个日期执行 运行 SUM
之前汇总每个日期的组。请原谅任何错别字。我没有你的测试表。
猜测 2:
SELECT Dates2
, SUM(SUM(TE2)) OVER (Order by Dates2)
FROM (
SELECT Dates2
, SUM(TE) AS TE2
FROM (
SELECT ISNULL(EOMONTH(ER.TCTimestamp), EOMONTH(SC.GoLiveDate)) AS Dates2
, EE.CompanyId
, Name
, SUM(CASE WHEN EmployeeStatusId IN ('0', '1', '2') THEN 1 ELSE 0 END) AS TE
FROM D.Employee EE
JOIN SuperAdmin.Customer AS SC
ON SC.CompanyId = EE.CompanyId
LEFT JOIN D.RegisteredUser AS ER
ON EE.RegisteredUserId = ER.RegisteredUserId
WHERE SC.CompanyId IN (76, 79)
GROUP BY ISNULL(EOMONTH(ER.TCTimestamp), EOMONTH(SC.GoLiveDate))
, EE.CompanyId
, Name
) AS A
GROUP BY Dates2, TE
) AS t1
GROUP BY Dates2
ORDER BY Dates2 desc
;
猜一:
SELECT Dates2
, SUM(SUM(TE)) OVER (Order by Dates2)
FROM (
SELECT ISNULL(EOMONTH(ER.TCTimestamp), EOMONTH(SC.GoLiveDate)) AS Dates2
, EE.CompanyId
, Name
, SUM(CASE WHEN EmployeeStatusId IN ('0', '1', '2') THEN 1 ELSE 0 END) AS TE
FROM D.Employee EE
JOIN SuperAdmin.Customer AS SC
ON SC.CompanyId = EE.CompanyId
LEFT JOIN D.RegisteredUser AS ER
ON EE.RegisteredUserId = ER.RegisteredUserId
WHERE SC.CompanyId IN (76, 79)
GROUP BY ISNULL(EOMONTH(ER.TCTimestamp), EOMONTH(SC.GoLiveDate))
, EE.CompanyId
, Name
) AS A
GROUP BY Dates2
ORDER BY Dates2 desc
;
如果这不是您想要的,请提供有关状态列和 date/timestamp 列含义的更多详细信息。
另外,还有一个细节可能需要解决。活跃客户可以变得不活跃吗?