【问题标题】:Sum only for Employee ID's present in latest snapshot仅对最新快照中存在的员工 ID 求和
【发布时间】: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


【解决方案1】:

您可以使用 PIVOT 来获得您想要的结果,如下所示-

SELECT EMPLOYEE_ID,
ISNULL([CUS],0) AS [EXP_CUS],
ISNULL([MKT],0) AS [EXP_MKT]
FROM 
(
    SELECT EMPLOYEE_ID,FUNCTION_CODE,COUNT(SNAPSHOT_DATE)  T
    FROM your_table
    GROUP BY EMPLOYEE_ID,FUNCTION_CODE
)P
PIVOT(
    SUM(T)
    FOR FUNCTION_CODE IN ([CUS],[MKT])
)PVT

输出是-

EMPLOYEE_ID EXP_CUS EXP_MKT
000000001   2       1
000000002   0       3

【讨论】:

    【解决方案2】:

    我不明白您为什么要使用自联接。这似乎可以满足您的要求:

    SELECT ED.EMPLOYEE_ID,
           SUM(CASE WHEN ED.FUNCTION_CODE ='CUS' THEN 1 ELSE 0 END) AS EXP_CUS,
           SUM(CASE WHEN ED.FUNCTION_CODE ='MKT' THEN 1 ELSE 0 END) AS EXP_MKT
    FROM [dbname].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL] ed 
    WHERE ED.WORKLEVEL_CODE > '1'
    GROUP BY ED.EMPLOYEE_ID;
    

    如果您只希望员工拥有最近的快照日期,那么您可以使用窗口函数:

    SELECT ED.EMPLOYEE_ID,
           SUM(CASE WHEN ED.FUNCTION_CODE ='CUS' THEN 1 ELSE 0 END) AS EXP_CUS,
           SUM(CASE WHEN ED.FUNCTION_CODE ='MKT' THEN 1 ELSE 0 END) AS EXP_MKT
    (SELECT ED.*,
            MAX(SNAPSHOT_DATE) OVER () as OVERALL_MAX_SNAPSHOT_DATE,
            MAX(SNAPSHOT_DATE) OVER (PARTITION BY EMPLOYEE_ID) as EMPLOYEE_MAX_SNAPSHOT_DATE            
     FROM [dbname].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL] ED
    ) ED
    WHERE ED.WORKLEVEL_CODE > '1' AND
          EMPLOYEE_MAX_SNAPSHOT_DATE = OVERALL_MAX_SNAPSHOT_DATE
    GROUP BY ED.EMPLOYEE_ID;
    

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 2014-06-19
      • 2021-03-13
      • 2012-03-06
      • 1970-01-01
      相关资源
      最近更新 更多