SQL 服务器 - 计算用户拥有有效合同的总天数
SQL Server - Counting total number of days user had active contracts
我想根据每个服务合同的开始和结束日期,根据 table 计算用户拥有有效合同的天数。我想计算任何 activity 的时间,无论客户是否同时激活了 1 个或 5 个合约。
+---------+-------------+------------+------------+
| USER_ID | CONTRACT_ID | START_DATE | END_DATE |
+---------+-------------+------------+------------+
| 1 | 14 | 18.02.2021 | 18.04.2022 |
| 1 | 13 | 02.01.2019 | 02.01.2020 |
| 1 | 12 | 01.01.2018 | 01.01.2019 |
| 1 | 11 | 13.02.2017 | 13.02.2019 |
| 2 | 23 | 19.06.2021 | 18.04.2022 |
| 2 | 22 | 01.07.2019 | 01.07.2020 |
| 2 | 21 | 19.01.2019 | 19.01.2020 |
+---------+-------------+------------+------------+
结果我想要 table:
+---------+--------------------+
| USER_ID | DAYS_BEEING_ACTIVE |
+---------+--------------------+
| 1 | 1477 |
| 2 | 832 |
+---------+--------------------+
在哪里
1477 等于 1053(从 2017 年 2 月 13 日到 2020 年 1 月 2 日 - 用户在此期间有有效合同)+ 424(从 2021 年 2 月 18 日到 2022 年 4 月 18 日)
832 等于 529(从 19.01.2019 到 01.07.2020 的天数)+ 303(从 19.06.2021 到 18.04.2022 的天数)。
我尝试了一些带有连接、datediff、case when 条件的查询,但没有任何效果。我将不胜感激。
如果您没有 Tally/Numbers table(强烈推荐),您可以使用 ad-hoc tally/numbers table
示例或dbFiddle
Select User_ID
,Days = count(DISTINCT dateadd(DAY,N,Start_Date))
from YourTable A
Join ( Select Top 10000 N=Row_Number() Over (Order By (Select NULL))
From master..spt_values n1, master..spt_values n2
) B
On N<=DateDiff(DAY,Start_Date,End_Date)
Group By User_ID
结果
User_ID Days
1 1477
2 832
我想根据每个服务合同的开始和结束日期,根据 table 计算用户拥有有效合同的天数。我想计算任何 activity 的时间,无论客户是否同时激活了 1 个或 5 个合约。
+---------+-------------+------------+------------+
| USER_ID | CONTRACT_ID | START_DATE | END_DATE |
+---------+-------------+------------+------------+
| 1 | 14 | 18.02.2021 | 18.04.2022 |
| 1 | 13 | 02.01.2019 | 02.01.2020 |
| 1 | 12 | 01.01.2018 | 01.01.2019 |
| 1 | 11 | 13.02.2017 | 13.02.2019 |
| 2 | 23 | 19.06.2021 | 18.04.2022 |
| 2 | 22 | 01.07.2019 | 01.07.2020 |
| 2 | 21 | 19.01.2019 | 19.01.2020 |
+---------+-------------+------------+------------+
结果我想要 table:
+---------+--------------------+
| USER_ID | DAYS_BEEING_ACTIVE |
+---------+--------------------+
| 1 | 1477 |
| 2 | 832 |
+---------+--------------------+
在哪里
1477 等于 1053(从 2017 年 2 月 13 日到 2020 年 1 月 2 日 - 用户在此期间有有效合同)+ 424(从 2021 年 2 月 18 日到 2022 年 4 月 18 日)
832 等于 529(从 19.01.2019 到 01.07.2020 的天数)+ 303(从 19.06.2021 到 18.04.2022 的天数)。
我尝试了一些带有连接、datediff、case when 条件的查询,但没有任何效果。我将不胜感激。
如果您没有 Tally/Numbers table(强烈推荐),您可以使用 ad-hoc tally/numbers table
示例或dbFiddle
Select User_ID
,Days = count(DISTINCT dateadd(DAY,N,Start_Date))
from YourTable A
Join ( Select Top 10000 N=Row_Number() Over (Order By (Select NULL))
From master..spt_values n1, master..spt_values n2
) B
On N<=DateDiff(DAY,Start_Date,End_Date)
Group By User_ID
结果
User_ID Days
1 1477
2 832