SSRS的常规运行总计 - SQL Server

时间:2017-05-31 14:02:44

标签: sql sql-server reporting-services

我目前有一个类似于下图的数据集:

enter image description here

基本上有些案例全年开放和关闭。我被要求做一份报告(最后真的是一个条形码),它按月和案例类型总结了案件的总数(唯一的订户ID数)。

虽然我遇到麻烦但他们希望将其作为一个总计。因此,如果该案件于2017年1月创建并且仍然在2017年3月开放,那么他们希望它仍然计入2017年3月。仅在案件结束后的那个月,他们希望它不再计入一个月&#39总共。

所以基本上如果在2016年12月发生了10例开放式2病例并且他们没有在12月关闭,并且2017年1月没有新的开放病例,那么2017年1月将显示10例开放式2病例。如果同样的10个案例在1月没有关闭,那么他们将在2月部分出现,并在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

中添加零(ClosedPreprocessed)行

答案 1 :(得分:0)

这并不是一个"正在运行的总数"。它简单得多。

只是SUM一个CASE表达式,该表达式在当前月份之前打开的每一行都返回1,并且在当前月份之前未关闭。 ELSE 0。