【问题标题】:TSQL select and join issueTSQL 选择和加入问题
【发布时间】:2019-03-06 10:52:56
【问题描述】:

我有两个表,EMPL 是一个历史员工表,用于跟踪员工税率的变化,而 PAYROLL 也是一个历史表,其中包含多个时期的员工工资。

从 EMPL,基于 EMPL.effect_pd

下面是两个表,查询和结果集。但是,我只希望每个支付期的每个员工有 1 条记录,这与基于 payroll_pd 和 effect_pd 的相关员工记录相匹配。


(点击图片放大)

【问题讨论】:

标签: tsql join where-clause having-clause


【解决方案1】:

首先 - 欢迎!

您编写了“...FROM EMPL,基于 EMPL.effect_pd

请先测试此语句:

SELECT
    E.rec_id
    ,E.empl_id
    ,E.empl_name
    ,E.tax_rate
    ,E.effect_pd
    ,P.rec_id
    ,P.payroll_pd
    ,P.empl_id
    ,P.pd_pay
FROM
    empl AS E
LEFT OUTER JOIN
    payroll AS P
ON      E.empl_id = P.empl_id
    AND E.effect_pd < P.payroll_pd

之后,您将获得 7 条唯一的记录。

我想,就是这样。 最好的问候

【讨论】:

  • 不幸的是,这仍然没有产生所需的输出。我知道我在最初解释我想要达到的目标时做得最好,所以就这样吧。员工表是一个历史表,用于跟踪员工随时间的变化。工资表也是一个历史表,按支付期间存储员工工资。因此,每次对员工进行更改时,都会添加一条带有生效期的新记录,并且应该从该支付期开始使用,直到工资表中存储的各个支付期遇到下一个员工更改记录。
  • 两张表的关键字段是什么,句号字段在哪里?例如三月到六月是一个时期,我认为
  • 约翰和弗雷德是怎么回事? emp_id = 'e002' -> John 还有 emp_id = 'e002' = Fred?那是 korrekt 吗? (rec_id之间的区别??)
  • 我终于找到了解决方案,现在想弄清楚如何发布 SQL 代码。 SELECT * FROM PAYROLL p LEFT JOIN EMPL e on p.empl_id = e.empl_id WHERE e.rec_id = ( SELECT TOP 1 c.rec_id FROM EMPL c WHERE c.empl_id = p.empl_id AND p.payroll_pd >= c.effect_pd ORDER通过 c.effect_pd DESC );去
  • 添加另一个答案,而不是另一个评论
【解决方案2】:

折腾了 3 天的代码,我终于找到了解决方案:

SELECT * FROM PAYROLL p 
LEFT JOIN EMPL e on p.empl_id = e.empl_id 
WHERE e.rec_id = ( SELECT TOP 1 c.rec_id 
               FROM EMPL c 
               WHERE c.empl_id = p.empl_id 
                  AND p.payroll_pd >= c.effect_pd 
               ORDER BY c.effect_pd DESC );

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多