SQL Server 2008按日期加入获取正确的值

时间:2017-08-29 19:33:30

标签: sql sql-server sql-server-2008 date join

我的情景并不难。基本上,我有两个表,我需要通过PK和日期加入他们,事实是薪水表每个月付款有一个日期,第二个名为奖金的表只有一个年度奖金的日期必须是在宣布年度奖金之后的日期与薪水挂钩,但直到明年奖金。

知道这一点,只是你给了一个想法,这就是你检查表格的方法。 薪资表:

enter image description here

示例数据:

DateHist; NumSalarie; ValeurMontant; ChargePatronal; ChargesSalariales

2012-10-31 00:00:00.000; 1; 3519; 1322; 766,49 2012-11-30 00:00:00.000; 1; 3519; 1322; 766,49 2012-12-31 00:00:00.000; 1; 3519; 1322; 766,49 2013-01-31 00:00:00.000; 1; 3519; 1395,15; 867,84 2013-02-28 00:00:00.000; 1; 3592,33; 1936,78; 1157,09 2013-03-31 00:00:00.000; 1; 3592,33; 1423,23; 882,85 2013-04-30 00:00:00.000; 1; 3592,33; 1423,23; 882,85 2013-05-31 00:00:00.000; 1; 3592,33; 1423,23; 882,85 2013-06-30 00:00:00.000; 1; 3592,33; 1423,23; 882,85 2013-07-31 00:00:00.000; 1; 3592,33; 1423,23; 882,85 2013-08-31 00:00:00.000; 1; 3592,33; 1202,4; 765,41 2013-09-30 00:00:00.000; 1; 3592,33; 1385,19; 862,52 2013-10-31 00:00:00.000; 1; 3592,33; 1423,23; 882,85 2013-11-30 00:00:00.000; 1; 3592,33; 1423,23; 882,85 2013-12-31 00:00:00.000; 1; 3592,33; 1423,23; 882,85 2014-01-31 00:00:00.000; 1; 3592,33; 1439,35; 897,52 2014-02-28 00:00:00.000; 1; 3592,33; 1825,8; 1104,15 2014-03-31 00:00:00.000; 1; 3666,67; 2858,27; 1656,17 2014-04-30 00:00:00.000; 1; 3666,67; 1468,1; 912,89 2014-05-31 00:00:00.000; 1; 3666,67; 1468,1; 912,89

奖金表:

enter image description here

示例数据:

CodeRubrique; NumSalarie; ValeurMontant; DateHist

1200; 1; 1267; 2013-02-28 00:00:00.000 1200; 1; 3448,64; 2014-03-31 00:00:00.000 1200; 1; 3633; 2015-03-31 00:00:00.000 1200; 1; 2244; 2015-09-30 00:00:00.000 1200; 1; 4042,84; 2016-10-31 00:00:00.000

所以,现在当我加入两个表时,我在T-SQL中执行:

SELECT 
salpaid.DateHist,
salpaid.NumSalarie,
salpaid.ValeurMontant,
bonus.ValeurMontant AS bonus
FROM
    (select CodeRubrique,NumSalarie,ValeurMontant,DateHist
    FROM table ) salpaid
LEFT JOIN 
    (select CodeRubrique,NumSalarie,ValeurMontant,DateHist
    FROM T_HBNS
    WHERE  CodeRubrique='1200')  bonus
ON salpaid.NumSalarie=bonus.NumSalarie
AND salpaid.DateHist >= bonus.DateHist

所以,这是我的问题。事情是,日期加入它是不对的,因为完成第一年奖金后的结果,然后我是在第一年奖金后我连接两次的日期。上一年奖金和当前奖金。只是为了向你们展示我的输出:

enter image description here

正如您所看到的,第73行之前的付款在奖金中为NULL,因为第一个注册的奖金是在这些日期之后,然后在第74行和第87行之间是可以的。当我获得第二年奖金时,噩梦来了,因为我获得了正确奖金类别的链接,但我还有另外一个与上一年奖金相关的链接,因为你可以在88后看到。

我应该如何改进我的代码以获得正确的JOIN?

谢谢你们

2 个答案:

答案 0 :(得分:1)

如果您使用每个奖金的开始日期和结束日期构建CTE,您可以外部加入到DateHist落在奖金的开始日期和结束日期之间的cte

WITH Bonus_Ordered AS (
    SELECT  *,
            ROW_NUMBER() OVER (PARTITION BY [NumSalarie] ORDER BY [DateHist]) Rn
    FROM    Bonus
    WHERE   CodeRubrique = '1200' 
),   

Bonus_Periods AS (
    SELECT  a.*, 
            b.DateHist - 1 AS EndDateHist 
    FROM    Bonus_Ordered a LEFT JOIN Bonus_Ordered b ON a.Rn + 1 = b.Rn
)

SELECT  *
FROM    Salary s
        LEFT JOIN Bonus_Periods bp ON s.NumSalarie = bp.NumSalarie 
             AND s.DateHist BETWEEN bp.DateHist AND bp.EndDateHist
ORDER BY s.DateHist

SQL Fiddle example

答案 1 :(得分:0)

如果您更改

,该怎么办?

salpaid.DateHist> = bonus.DateHist

年(salpaid.DateHist)=年(bonus.DateHist)