noc*_*374 1 sql t-sql sql-server common-table-expression
假设我有一个日期范围 @StartDate = 2022-01-01 和 @EndDate = 2022-02-01,这是一个报告期。
此外,我还有客户记录,其中每个客户都有一个 LIVE Date 和一个 ServiceEndDate (或 ServiceEndDate = NULL,因为他们是持续客户)
某些客户的实时日期和服务结束日期范围可能超出报告期间范围。我只想报告几天他们是该期间的客户。
| 姓名 | 实时约会 | 服务结束日期 |
|---|---|---|
| 汤姆 | 2021-10-11 | 2022-01-13 |
| 标记 | 2022-11-13 | 2022-02-15 |
| 安迪 | 2022-01-02 | 2022-02-10 |
| 抢 | 2022-01-09 | 2022-01-14 |
我想创建一个表,其中 A 列是日期(在报告期间的每个日期之间迭代),B 列是该日期的客户数量总和。
像这样的东西
| 日期 | 客户数量 |
|---|---|
| 2022-01-01 | 2 |
| 2022-01-02 | 3 |
| 2022-01-03 | 3 |
| 2022-01-04 | 3 |
| 2022-01-05 | 3 |
| 2022-01-06 | 3 |
| 2022-01-07 | 3 |
| 2022-01-08 | 3 |
| 2022-01-09 | 4 |
| 2022-01-10 | 4 |
| 2022-01-11 | 4 |
| 2022-01-12 | 4 |
| 2022-01-13 | 4 |
| 2022-01-14 | 3 |
| 2022-01-15 | 3 |
依此类推,直到@EndDate结束
任何帮助将不胜感激,谢谢。
您可以将表连接到包含您需要的所有日期的日历表:
WITH calendar
AS (SELECT Cast('2022-01-01' AS DATETIME) AS d
UNION ALL
SELECT Dateadd(day, 1, d)
FROM calendar
WHERE d < '2022-02-01')
SELECT d AS "Date",
Count(*) AS NumberOfCustomers
FROM calendar
INNER JOIN table_name
ON d BETWEEN livedate AND COALESCE(serviceenddate, '9999-12-31')
GROUP BY d;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2138 次 |
| 最近记录: |