MySQL:加入这两个表并用最新的表填充缺失值

时间:2017-02-09 18:07:11

标签: mysql sql

我有下表months

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表,但我失败了。我在过去的两个小时里尝试过但没有成功。

我很感谢你的帮助。

1 个答案:

答案 0 :(得分: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