请参见下面的代码。对于介于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
答案 0 :(得分:3)
我将使用内联子查询来解决这个问题。这避免了聚合的需求,这在大量记录上可能会很昂贵。
此外,当在相应的时间间隔内没有假日记录存在时,子查询将返回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
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