2017-08-29 36 views
0

我的場景並不很難。基本上,我有兩張桌子,我需要通過一個PK和一個日期加入他們,事情是薪水錶每個月付款都有一個日期,而第二個叫做獎金的表格只有一個年度獎金的日期,必須是與宣佈年度獎金之日的薪水掛鉤,但直到明年獎金。SQL Server 2008按日期加入獲取正確的值

知道了,只是你給了你一個想法,這是你如何檢查表。 工資表:

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; 20 14-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都OK之間的日期之後。當我獲得第二年獎金時,噩夢來了,因爲我在右邊的獎勵類別中獲得了一個鏈接,但是我還有另外一個與前一年獎金的鏈接,您可以在88行後面看到。

我應該如何改進我的代碼得到正確的JOIN?

謝謝你們

+0

工資表缺少頭 – scsimon

+0

這裏是一個偉大的地方開始。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/你也應該指定你正在使用哪個DBMS作爲mysql <> sql server 。 –

+0

樣本數據最好用作DDL + DML。圖像是最糟糕的。 –

回答

1

如果你建立一個CTE爲每個獎金的開始和結束日期,可以外連接到該DateHist落在獎金的開始和結束日期之間的熱膨脹係數

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

+0

好的方法好友我知道了,實際上在我加入COALESCE(bp.EndDateHist,getdate())之間的加入中,保證總是覆蓋正確的數量!謝謝 –

+0

@AndresAngel很好的接收..當我測試cte的時候,我想到了最後一個空的日期,但是忘了修復它。 'Bonus_Periods' cte可能是一個更好的地方把'coalesce(b.DateHist - 1,getdate())AS EndDateHist' – JamieD77

0

如果你改變什麼

salpaid.DateHist> = bonus.DateHist

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