我目前有一个类似于下图的数据集:
基本上有些案例全年开放和关闭。我被要求做一份报告(最后真的是一个条形码),它按月和案例类型总结了案件的总数(唯一的订户ID数)。
虽然我遇到麻烦但他们希望将其作为一个总计。因此,如果该案件于2017年1月创建并且仍然在2017年3月开放,那么他们希望它仍然计入2017年3月。仅在案件结束后的那个月,他们希望它不再计入一个月&#39总共。
所以基本上如果在2016年12月发生了10例开放式2病例并且他们没有在12月关闭,并且2017年1月没有新的开放病例,那么2017年1月将显示10例开放式2病例。如果同样的10个案例在1月没有关闭,那么他们将在2月部分出现,并在2月份增加任何新开的2型案件。
如果这听起来并不令人困惑,并且某人已经使用过类似的东西,那么任何帮助都会非常感激。我的小组知识现在很难让我失望。
答案 0 :(得分:1)
DECLARE @Test TABLE (
CaseOpenYearMonth VARCHAR(255),
CaseType INT,
CaseStatus VARCHAR(255),
CaseCloseDate DATE
)
INSERT INTO @Test VALUES
('2017-02', 1, 'Open', NULL),
('2016-12', 1, 'Open', NULL),
('2013-05', 5, 'Closed', '2013-10-22'),
('2017-02', 1, 'Open', NULL),
('2017-04', 1, 'Open', NULL),
('2017-01', 1, 'Open', NULL),
('2013-05', 2, 'Closed', '2013-07-08'),
('2013-10', 0, 'Closed', '2013-10-16'),
('2013-10', 2, 'Closed', '2014-02-06'),
('2016-11', 2, 'Open', NULL)
;WITH Preprocessed AS(
SELECT
YearMonth = CaseOpenYearMonth,
CaseType = CaseType,
Opened = 1,
Closed = 0
FROM @Test YT
UNION ALL
SELECT
YearMonth = FORMAT(CaseCloseDate, 'yyyy-MM'),
CaseType = CaseType,
Opened = 0,
Closed = 1
FROM @Test YT
WHERE CaseCloseDate IS NOT NULL
), GroupedData AS (
SELECT
YearMonth = YearMonth,
CaseType = CaseType,
Opened = SUM(Opened),
Closed = SUM(Closed)
FROM Preprocessed
GROUP BY YearMonth, CaseType
)
SELECT
YearMonth = YearMonth,
CaseType = CaseType,
Opened = Opened,
Closed = Closed,
Active = SUM(Opened) OVER (PARTITION BY CaseType ORDER BY YearMonth ROWS UNBOUNDED PRECEDING)
- ISNULL(SUM (Closed) OVER (PARTITION BY CaseType ORDER BY YearMonth ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0)
FROM GroupedData
ORDER BY YearMonth
如果案件数没有改变,这将不包括月份
如果要包含它,则应在Opened
表
Closed
和Preprocessed
)行
答案 1 :(得分:0)
这并不是一个"正在运行的总数"。它简单得多。
只是SUM一个CASE表达式,该表达式在当前月份之前打开的每一行都返回1,并且在当前月份之前未关闭。 ELSE 0。