2017-02-09 96 views
2

我下表months的MySQL:連接這兩個表和

date (date) 
----------- 
2016-11-01 
2017-12-01 
2017-01-01 
2017-02-01 
2017-03-01 
2017-04-01 
2017-05-01 
... 

除了表weeklyhours

date (date) | hours (time) 
-------------------------- 
2017-01-01 | 05:00:00 
2017-01-03 | 12:00:00 

我想要一個SELECT得到最近期的填補缺失值查詢組合兩個表並獲得以下輸出result

date (date) | hours (time) 
-------------------------- 
2016-11-01 |  NULL 
2016-12-01 |  NULL 
2017-01-01 | 05:00:00 
2017-02-01 | 05:00:00 
2017-03-01 | 12:00:00 
2017-04-01 | 12:00:00 
2017-05-01 | 12:00:00 
... 

所以我需要加入weekylhours表和months表,但是我失敗了。我已經嘗試了最後兩個小時沒有成功。

我很感激任何幫助。

+0

你試用的條件是什麼? – affaz

+0

我試着用另一個JOIN來獲取最近的日期,以便我可以在以下日期使用相同的值。用一個簡單的LEFT JOIN(見Yousaf的答案),我會以'weeklyhours'= 5來得到'2017-02-01',但是'2017-02-02'將有NULL作爲每週時間。但我需要它也是5,直到'2017-03-01' – trostpflaster

回答

0

這是一個古老的問題,但這是一個答案,以防別人需要它。另外作爲一個說明,在初始文章中有一個錯誤。第二個日期應該是2017-03-01而不是2017-01-03(否則沒有月差)。

總的來說,這取決於'每週小時'是一個累計值。週期值只需要在初始連接中累計小時數,而不必查找最大日期,然後創建第二次連接。

DECLARE @temp_months TABLE(
    [mth] [date] NOT NULL 
) 

DECLARE @temp_weeklyhours TABLE(
    [Date] [date] NOT NULL, 
    [Hours] [time] not null 
) 

INSERT INTO @temp_months (mth) 
VALUES ('2016-11-01'), 
     ('2017-12-01'), 
     ('2017-01-01'), 
     ('2017-02-01'), 
     ('2017-03-01'), 
     ('2017-04-01'), 
     ('2017-05-01') 

INSERT INTO @temp_weeklyhours ([Date],[Hours]) 
VALUES ('2017-01-01','05:00:00'), 
     ('2017-03-01','12:00:00') 

SELECT t.mth as [Date], [Hours] 
FROM 
     (
      SELECT m.mth, max([Date]) UseDate 
      FROM  
        @temp_months as m 
       LEFT JOIN 
        @temp_weeklyhours as w 
       ON m.mth >= w.[Date] 
      GROUP BY m.mth 
     ) as t 
    LEFT JOIN 
     @temp_weeklyhours as h 
    ON t.UseDate = h.[Date] 
ORDER BY t.mth