Объединение таблиц по датам, но выравнивание одной таблицы по дополнительному дню - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть две таблицы ниже:

таблица A

+------------+-------+
|    Date    | Value |
+------------+-------+
| 11-08-2018 |   2.3 |
| 11-09-2018 |   4.3 |
| 11-12-2018 |   2.9 |
| 11-13-2018 |   3.9 |
+------------+-------+

стол B

+------------+---------+
|    Date    |  Value  |
+------------+---------+
| 11-07-2018 |   -6.99 |
| 11-08-2018 | 12.3333 |
| 11-09-2018 |   14.22 |
| 11-12-2018 |    3.66 |
+------------+---------+

Мне нужно присоединиться к ним в поле «Дата», однако я хочу присоединиться к ним, чтобы получить результат, подобный приведенному ниже (т.е. я хочу добавить день в поле даты в таблице B, также игнорируя выходные) *

+------------+---------+---------+
|    Date    | Value A | Value B |
+------------+---------+---------+
| 11-08-2018 |     2.3 |   -6.99 |
| 11-09-2018 |     4.3 |  12.333 |
| 11-12-2018 |     2.9 |   14.22 |
| 11-13-2018 |     3.9 |    3.66 |
+------------+---------+---------+

Как лучше всего этого добиться?

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Если вы хотите присоединиться к понедельнику с предыдущей пятницей:

SELECT *
FROM tablea
INNER JOIN tableb ON DATEADD(DAY, IIF(DATENAME(WEEKDAY, tablea.Date) = 'Monday', -3, -1), tablea.Date) = tableb.Date
0 голосов
/ 14 ноября 2018

Определите функцию, которая добавляет дни к дате, пропуская выходные дни:

create function dbo.udf_AddWorkingDays(@dateToIncrement as date, @daysToAdd as int)
returns datetime
as
begin
    SET @dateToIncrement = dateadd(d, @daysToAdd, @dateToIncrement)

    --skip sundays
    IF datename(DW, @dateToIncrement) = 'sunday'   
        SET @dateToIncrement = dateadd(d, 1, @dateToIncrement)

    --skip saturdays
    IF datename(DW, @dateToIncrement) = 'saturday' 
        SET @dateToIncrement = dateadd(d, 2, @dateToIncrement)

    return cast(@dateToIncrement AS datetime)
end

Используйте функции в вашем условии соединения:

declare  @tableA table ([Date] date , [Value] decimal(10,2))
declare  @tableB table ([Date] date , [Value] decimal(10,2))
insert into @tableA values
 ('2018-11-08', 2.3)
,('2018-11-09', 4.3)
,('2018-11-12', 2.9)
,('2018-11-13', 3.9)

insert into @tableB values
 ('2018-11-07', -6.99  )
,('2018-11-08', 12.3333)
,('2018-11-09', 14.22  )
,('2018-11-12', 3.66   )

select A.[Date], A.[Value], B.[Value]
from @tableA A
inner join @tableB B on A.[Date] = dbo.udf_AddWorkingDays(B.[Date], 1)

Результат:

enter image description here

0 голосов
/ 14 ноября 2018

Вы можете соответствующим образом изменить ваше условие присоединения

SELECT TableA.Date, TableA.Value as [Value A], TableB.Value as [Value B]
FROM TableB
JOIN TableA
ON TableA.Date = DATEADD(day, 1, TableA.Date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...