如何获取 SQL 服务器超过 1 年的日期范围内的数据并结合 2 个表?
How to get data between range of dates in SQL Server over 1 year combining 2 tables?
有2个table-
- 销售额 table,详细信息为 order_number、item_number 和 sale_date。
- 促销活动 table,包含 item_number、promotion_start_date 和 promotion_end_date 的详细信息。
促销活动 运行 全年在一定天数内进行。 需要在运行宁.
没有促销时提取已售商品列表
只需要提取
之间的订单号
- “第一个promotion_end_date”和“第二个promotion_start_date”然后
- “第二个promotion_end_date”和“第三个promotion_start_date”然后
- “第三个promotion_end_date”和“第四个promotion_start_date”等等
样本table如下-
1) 促销 table : ( 当 promotion_end_date 为 'Null' 时,促销仍为 'ACTIVE')
item_number
promotion_start_date
promotion_end_date
ABC0001
12-31-2020
01-19-2021
ABC0001
03-01-2021
03-31-2021
ABC0005
02-05-2021
03-01-2021
ABC0002
06-01-2021
07-31-2021
ABC0001
09-31-2021
11-05-2021
ABC0001
11-08-2021
Nil
2) 销售额 Table :
order_number
item_number
sale_date
110000011
ABC0001
01-18-2021
110000012
ABC0001
01-31-2021
110000013
ABC0002
06-30-2021
110000014
ABC0001
07-31-2021
110000015
ABC0005
04-05-2021
110000016
ABC0001
10-05-2021
110000017
ABC0001
12-01-2021
110000018
ABC0002
08-30-2021
110000019
ABC0001
04-01-2021
110000020
ABC0001
07-30-2021
110000021
ABC0005
02-28-2021
110000022
ABC0001
11-06-2021
3) 预期结果:
order_number
item_number
sale_date
110000012
ABC0001
01-31-2021
110000014
ABC0001
07-31-2021
110000015
ABC0005
04-05-2021
110000017
ABC0001
12-01-2021
110000018
ABC0002
08-30-2021
110000019
ABC0001
04-01-2021
110000020
ABC0001
07-30-2021
110000022
ABC0001
11-06-2021
有many ways to solve this kind of problem但我一般更喜欢NOT EXISTS
:
SELECT order_number, item_number, sale_date
FROM dbo.Sales AS s
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Promotions AS p
WHERE s.item_number = p.item_number
AND s.sale_date >= p.promotion_start_date
AND s.sale_date <= COALESCE(p.promotion_end_date, GETDATE())
);
我认为这里最棘手的部分是在促销进行时用有效时间点替换结束日期。
- 示例 db<>fiddle 展示了我们多么喜欢看到 table 结构和示例数据,并且还更正了 9 月 31 日。
有2个table-
- 销售额 table,详细信息为 order_number、item_number 和 sale_date。
- 促销活动 table,包含 item_number、promotion_start_date 和 promotion_end_date 的详细信息。
促销活动 运行 全年在一定天数内进行。 需要在运行宁.
没有促销时提取已售商品列表只需要提取
之间的订单号- “第一个promotion_end_date”和“第二个promotion_start_date”然后
- “第二个promotion_end_date”和“第三个promotion_start_date”然后
- “第三个promotion_end_date”和“第四个promotion_start_date”等等
样本table如下-
1) 促销 table : ( 当 promotion_end_date 为 'Null' 时,促销仍为 'ACTIVE')
item_number | promotion_start_date | promotion_end_date |
---|---|---|
ABC0001 | 12-31-2020 | 01-19-2021 |
ABC0001 | 03-01-2021 | 03-31-2021 |
ABC0005 | 02-05-2021 | 03-01-2021 |
ABC0002 | 06-01-2021 | 07-31-2021 |
ABC0001 | 09-31-2021 | 11-05-2021 |
ABC0001 | 11-08-2021 | Nil |
2) 销售额 Table :
order_number | item_number | sale_date |
---|---|---|
110000011 | ABC0001 | 01-18-2021 |
110000012 | ABC0001 | 01-31-2021 |
110000013 | ABC0002 | 06-30-2021 |
110000014 | ABC0001 | 07-31-2021 |
110000015 | ABC0005 | 04-05-2021 |
110000016 | ABC0001 | 10-05-2021 |
110000017 | ABC0001 | 12-01-2021 |
110000018 | ABC0002 | 08-30-2021 |
110000019 | ABC0001 | 04-01-2021 |
110000020 | ABC0001 | 07-30-2021 |
110000021 | ABC0005 | 02-28-2021 |
110000022 | ABC0001 | 11-06-2021 |
3) 预期结果:
order_number | item_number | sale_date |
---|---|---|
110000012 | ABC0001 | 01-31-2021 |
110000014 | ABC0001 | 07-31-2021 |
110000015 | ABC0005 | 04-05-2021 |
110000017 | ABC0001 | 12-01-2021 |
110000018 | ABC0002 | 08-30-2021 |
110000019 | ABC0001 | 04-01-2021 |
110000020 | ABC0001 | 07-30-2021 |
110000022 | ABC0001 | 11-06-2021 |
有many ways to solve this kind of problem但我一般更喜欢NOT EXISTS
:
SELECT order_number, item_number, sale_date
FROM dbo.Sales AS s
WHERE NOT EXISTS
(
SELECT 1
FROM dbo.Promotions AS p
WHERE s.item_number = p.item_number
AND s.sale_date >= p.promotion_start_date
AND s.sale_date <= COALESCE(p.promotion_end_date, GETDATE())
);
我认为这里最棘手的部分是在促销进行时用有效时间点替换结束日期。
- 示例 db<>fiddle 展示了我们多么喜欢看到 table 结构和示例数据,并且还更正了 9 月 31 日。