【问题标题】:Only include employees currently working for company仅包括目前为公司工作的员工
【发布时间】:2020-02-06 20:26:02
【问题描述】:

感谢我之前在本网站上收到的意见,我使用以下代码总结了我们的员工在特定市场中拥有多少个月的经验。

但问题是最终结果显示了所有员工的汇总数据,即使他们不再为我们公司工作。我真正想要的是相同的输出,但仅限于那些仍然在最年轻日期(SNAPSHOT_DATE)的员工。

我设法找到了一个每月手动更新快照的解决方案,但我宁愿选择一个自动化的解决方案,让代码本身决定最年轻的快照是什么。

非常感谢您的支持:)

SELECT EMPLOYEE_ID,
ISNULL([Developing & Emerging],0) AS [Experience - D&E],
ISNULL([Developed],0) AS [Experience - D]
FROM 
(
    SELECT EMPLOYEE_ID,MARKET_TYPE_DESC,COUNT(SNAPSHOT_DATE)  T
    FROM [db_name].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL]
  WHERE ALLC_SER_NUM = '1'
  GROUP BY EMPLOYEE_ID,MARKET_TYPE_DESC
)P
PIVOT(
    SUM(T)
    FOR MARKET_TYPE_DESC IN ([Developing & Emerging],[Developed])
)PVT

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    听起来您正在尝试将查询减少到仅返回 [db_name].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL].SNAPSHOT_DATE == 最新快照日期的结果。

    有多种方法可以实现这一点,但可能最简单、最容易阅读的方法如下:

    DECLARE @SnapshotDate DATETIME
     SELECT @SnapshotDate = MIN(SNAPSHOT_DATE ) FROM [db_name].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL]
    

    然后通过在主查询中加入 CTE,使用 CTE 将包含的员工列表减少到仅具有与此快照日期匹配的记录的员工:

    ;WITH CTE AS
    (
        SELECT EMPLOYEE_ID
          FROM [db_name].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL]
         WHERE SNAPSHOT_DATE = @SnapshotDate 
    )
     SELECT EMPLOYEE_ID,
        ISNULL([Developing & Emerging],0) AS [Experience - D&E],
        ISNULL([Developed],0) AS [Experience - D]
        FROM 
        (
            SELECT ED.EMPLOYEE_ID,ED.MARKET_TYPE_DESC,COUNT(ED.SNAPSHOT_DATE)  T
            FROM [db_name].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL] ED
            JOIN CTE C ON C.EMPLOYEE_ID = ED.EMPLOYEE_ID
          WHERE ED.ALLC_SER_NUM = '1'
          GROUP BY ED.EMPLOYEE_ID,ED.MARKET_TYPE_DESC
        )P
        PIVOT(
            SUM(T)
            FOR MARKET_TYPE_DESC IN ([Developing & Emerging],[Developed])
        )PVT    
    

    【讨论】:

      【解决方案2】:

      谢谢,@James S!非常感谢:)

      也许是一个愚蠢的问题,但我应该只创建一个结合您的输入的查询吗?看起来像下面的那个?

      DECLARE @SnapshotDate DATETIME
       SELECT @SnapshotDate = MIN(SNAPSHOT_DATE ) FROM [db_name].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL]
      
      WITH CTE AS
      (
          SELECT EMPLOYEE_ID
            FROM [db_name].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL]
           WHERE SNAPSHOT_DATE = @SnapshotDate 
      )
       SELECT EMPLOYEE_ID,
          ISNULL([Developing & Emerging],0) AS [Experience - D&E],
          ISNULL([Developed],0) AS [Experience - D]
          FROM 
          (
              SELECT EMPLOYEE_ID,MARKET_TYPE_DESC,COUNT(SNAPSHOT_DATE)  T
              FROM [db_name].[AGL_V_HRA_FE_R].[VW_HRA_EMPLOYEE_DETAIL] ED
              JOIN CTE C ON C.EMPLOYEE_ID = ED.EMPLOYEE_ID
            WHERE ALLC_SER_NUM = '1'
              AND SNAPSHOT_DATE = @SnapshotDate
            GROUP BY EMPLOYEE_ID,MARKET_TYPE_DESC
          )P
          PIVOT(
              SUM(T)
              FOR MARKET_TYPE_DESC IN ([Developing & Emerging],[Developed])
          )PVT
      

      我试过这个,但它似乎不起作用,因为它给出了以下回复:

      Incorrect syntax near 'CTE'. If this is intended to be a common table expression, you need to explicitly terminate the previous statement with a semi-colon.```
      

      【讨论】:

      • 嗨,Nipius - 是的,整个事情应该一起运行,我只是将其拆分,以便更好地解释它在做什么。您看到的错误可以通过在 CTE ";" 之前添加一个分号来解决。我将更新我的答案以包含它
      • 还请注意,我的原始答案中有一个错误(现在已修复),这将使您每条记录的计数为 1!原始子查询中的“SNAPSHOT_DATE = @SnapshotDate”是我在没有正确理解您的问题时汇总的上一个查询的剩余部分。
      • 谢谢,詹姆斯 S!不过还是有错误:) Msg 209, Level 16, State 1, Line 19 Ambiguous column name 'EMPLOYEE_ID'. Msg 209, Level 16, State 1, Line 15 Ambiguous column name 'EMPLOYEE_ID'.
      • 您需要在子查询中为 Employee_ID 设置别名。我现在修改我的答案。
      • 太棒了。非常感谢,詹姆斯!这正是我想要的。非常感谢:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多