【发布时间】:2019-11-26 02:31:49
【问题描述】:
我有一个数据库,每个月在我们公司工作的每个员工都有一行。所以,如果员工 A 从 2016 年 7 月到现在一直在我们公司工作,这个人大约有。 24 行(她服役的每个月一行)。
我正在尝试总结每个当前员工在特定职能方面的经验。因此,如果员工 A 在销售部门工作了 6 个月,在营销部门工作了 18 个月,那么我计算该员工在指示职能的列中拥有销售或营销的行数。
我创建了一个代码,它似乎计算了每位员工的功能体验,但它重复计算了数据。它不以最新的快照为起点。
SELECT A.EMPLOYEE_ID,
SUM(CASE WHEN A.FUNCTION_CODE ='CUS' THEN 1 ELSE 0 END) AS EXP_CUS,
SUM(CASE WHEN A.FUNCTION_CODE ='MKT' THEN 1 ELSE 0 END) AS EXP_MKT
FROM [dbname].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL] AS A INNER JOIN [dbname].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL] AS B ON A.EMPLOYEE_ID = B.EMPLOYEE_ID
WHERE B.WORKLEVEL_CODE > '1'
GROUP BY A.EMPLOYEE_ID
我预计员工 A 的输出为 EXP_CUS = 6 和 EXP_MKT = 18。相反,两者的输出要高得多,因为它是重复计算行数。当我添加 AND B.SNAPSHOT_DATE = '2019-06-30' 行时,输出是正确的。我不喜欢每个月手动调整代码,而是参考最新的快照日期。
添加 原表是这样的
SNAPSHOT_DATE | EMPLOYEE_ID | FUNCTION_CODE
2019-06-30 | 000000001 | CUS
2019-06-30 | 000000002 | MKT
2019-05-31 | 000000001 | CUS
2019-05-31 | 000000002 | MKT
2019-04-30 | 000000001 | MKT
2019-04-30 | 000000002 | MKT
期望的输出是
EMPLOYEE_ID | EXP_CUS | EXP_MKT
000000001 | 2 | 1
000000002 | 0 | 3
【问题讨论】:
-
请为所有涉及的表添加示例数据和预期输出。
-
您在其中一个表中有重复的 EMPLOYEE_ID,这使计数数据加倍,共享您的表数据,这将有助于识别问题
-
感谢@TimBiegeleisen 和 Zaynul。我已经更新了我的初始帖子以反映原始数据库和我想要的输出。
标签: sql sql-server