对齐具有不同日期的表格

时间:2018-05-18 14:34:42

标签: sql sql-server sql-server-2012

我有两个表,名为tblDaily和tblWeekly。

所以tblDaily包含每日数据和tblWeekly包含每周五存储的数据。

因此,当每日数据中的日期是星期五时,很容易将每日表加入每周表。

我的问题是,当日期不是星期五时,加入的最佳方式是什么。例如,假设我的日期是2018-05-09(星期三),我想在上个星期五(2018-05-04)加入。这样做的最佳方式是什么?

我读到了一张日历表,这是正确的方法吗?虽然我不确定在这种情况下它会如何起作用?

   tblDaily
   date         val
   2018-04-30   2              'mon
   2018-05-01   3              'tues
   2018-05-02   3              'wed
   2018-05-03   3              'thurs
   2018-05-04   3              'fri
   2018-05-07   2              'mon
   2018-05-08   3              'tues
   2018-05-09   3              'wed
   2018-05-10   3              'thurs
   2018-05-11   3              'fri
   2018-05-14   3              'mon

   tblWeekly
   date         val
   2018-05-04   2              'fri
   2018-05-11   3              'fri

3 个答案:

答案 0 :(得分:1)

这可能有效:

SELECT
    [dailydate] = D.[date],
    [dailyval] = D.[val],
    [weeklydate] = W.[date],
    [weeklyval] = W.[val]
FROM
    [tblDaily] AS D
    OUTER APPLY (SELECT TOP (1) _W.*
                 FROM [tblWeekly] AS _W
                 WHERE _W.[date] <= D.[date]
                 ORDER BY _W.[date] DESC) AS W;

此查询产生以下结果:

dailydate   dailyval  weeklydate  weeklyval
2018-04-30  2         NULL        NULL
2018-05-01  3         NULL        NULL
2018-05-02  3         NULL        NULL
2018-05-03  3         NULL        NULL
2018-05-04  3         2018-05-04  2
2018-05-07  2         2018-05-04  2
2018-05-08  3         2018-05-04  2
2018-05-09  3         2018-05-04  2
2018-05-10  3         2018-05-04  2
2018-05-11  3         2018-05-11  3
2018-05-14  3         2018-05-11  3

答案 1 :(得分:0)

尝试这样的事情:

select * from tblDaily a join tblWeekly b on a.date1= dateadd(day,-5,b.date2)

答案 2 :(得分:0)

试试这个简单的join

select *
from tblDaily [d]
--first condition in join is to match firdays exactly
left join tblWeekly [w] on [w].[date] = [d].[date] or
    --here you are joining fridays from tblWeekly to last friday before the date in tblDaily
    [w].[date] = dateadd(day, -datepart(weekday, [d].[date]) - 1, [d].[date])

这是SQL fiddle