Добавление стоимости на основе критерия даты - PullRequest
1 голос
/ 16 октября 2019

Пожалуйста, смотрите код ниже. Для каждого существующего Holiday, которое находится между UW_Date и UW_Date_Month_Start, я хотел бы создать новый столбец с именем new_int, который равен UW_int + количество праздников, которые произошли за этот месяц. .

SELECT *
FROM [Table6]
LEFT JOIN [] ON Table6.Name = ??

Исходная таблица:

Name    | UW_Date    | UW_Date_Month_Start | UW_int |
-----------------------------------------------------
Kim     | 9/4/2019   | 9/1/2019            | 3      |
Billy   | 9/10/2019  | 9/1/2019            | 7      |
Steve   | 10/21/2019 | 10/1/2019           | 5      |
Nicki   | 10/10/2019 | 10/1/2019           | 1      |


Holiday  |
-------- |
9/4/2019 |
9/1/2019 |
CREATE TABLE [Table6] ([Name] nvarchar(10), [UW_Date] datetime, [UW_Date_Month_Start] datetime, [UW_int] int)

INSERT INTO [Table6] VALUES ('Kim', '9/4/2019', '9/1/2019', 3)
INSERT INTO [Table6] VALUES ('Billy', '9/10/2019', '9/1/2019', 7)
INSERT INTO [Table6] VALUES ('Steve', '10/21/2019', '10/1/2019', 5)
INSERT INTO [Table6] VALUES ('Nicki', '10/10/2019', '10/1/2019', 1)

CREATE TABLE [Holiday_Table] ([Holiday] datetime)

INSERT INTO [Holiday_Table] VALUES ('9/7/2019')
INSERT INTO [Holiday_Table] VALUES ('10/15/2019')

Окончательный результат:

Name    | UW_Date    | UW_Date_Month_Start | UW_int | new_int
--------------------------------------------------------------
Kim     | 9/4/2019   | 9/1/2019            | 3      | 3
Billy   | 9/10/2019  | 9/1/2019            | 7      | 8
Steve   | 10/21/2019 | 10/1/2019           | 5      | 6
Nicki   | 10/10/2019 | 10/1/2019           | 1      | 1

1 Ответ

3 голосов
/ 16 октября 2019

Я бы подошел к этому с помощью встроенного подзапроса. Это позволяет избежать необходимости агрегирования, которое может быть дорогостоящим для большого количества записей.

Кроме того, если для соответствующего интервала не существует записей выходных, подзапрос возвращает 0, поэтому нет необходимости использовать дескриптор null (кроме случаев, когда выполняется left join).

select
    t.*,
    t.UW_int + (
        select count(*) 
        from holiday_table h 
        where h.holiday between t.UW_Date_Month_Start and t.UW_Date
    ) new_int
from table6 t

Демонстрация на DB Fiddle :

Name  | UW_Date             | UW_Date_Month_Start | UW_int | new_int
:---- | :------------------ | :------------------ | -----: | ------:
Kim   | 04/09/2019 00:00:00 | 01/09/2019 00:00:00 |      3 |       3
Billy | 10/09/2019 00:00:00 | 01/09/2019 00:00:00 |      7 |       8
Steve | 21/10/2019 00:00:00 | 01/10/2019 00:00:00 |      5 |       6
Nicki | 10/10/2019 00:00:00 | 01/10/2019 00:00:00 |      1 |       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...