SQL - 按日期分组防止重复

SQL - Group by Date prevent duplicates

我正在尝试创建 运行 每月员工总数的月和年总数。

我有以下内容:

我只想按 日期

对计数进行分组

举个例子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 中出现的次数SCRegisteredUserIDEmployeeStatusID

到目前为止我的代码

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  

添加了一个测试用例。请使用显示您不喜欢的行为的数据更新此信息。注明预期结果:

Working Test Case

关于感兴趣的列的含义确实不够详细。但是,假设您真的想每天计算这些案例,以下内容将 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 列含义的更多详细信息。

另外,还有一个细节可能需要解决。活跃客户可以变得不活跃吗?