Reporting services 如何从ssrs中的12行中获取以前的值

Reporting services 如何从ssrs中的12行中获取以前的值,reporting-services,Reporting Services,我在SSRS中有一份报告,显示每个月的收入: | MO-YR | Revenue| |01-2019 | $10.000| |02-2019 | $13.000| |03-2019 | $9.500 | |... |... | |... |... | |... |... | |10-2020 | $21.000| |11-2020 | $850 | 我必须做3个月平均值

我在SSRS中有一份报告,显示每个月的收入:

    | MO-YR  | Revenue|
    |01-2019 | $10.000|
    |02-2019 | $13.000|
    |03-2019 | $9.500 |
    |...     |...     |
    |...     |...     |
    |...     |...     |
    |10-2020 | $21.000|
    |11-2020 | $850   |
我必须做3个月平均值和12个月平均值,例如: 2020年4月的3个月平均值为[2020年1月收入+2020年2月收入+2020年3月收入]/3。 12个月的平均值是一样的,但是12个月加起来,然后除以12。我的问题是:我怎样才能获得前3行的值,以及如何从SSRS中的前12行中获得值

我还添加了数据集源存储过程的代码:

    SELECT
        *
        FROM 
            (SELECT
            pr.company_name AS [CompanyName],
            pr.sr_service_recid AS [Ticket],
            pr.unit_price AS [Invoice Amount],
            FORMAT(ih.Date_Invoice, 'MM-yyyy') AS [MO YR],
            FORMAT(EOMONTH(ih.Date_Invoice),'dd') AS [MO Days],
            ih.Date_Invoice AS [WorkDate]
            FROM
            Product pr
            LEFT JOIN InvoiceHeader ih
                ON 
                    ih.Billing_Log_RecID = pr.Billing_Log_RecID 
                    AND 
                    ih.Company_RecID = pr.company_recid
            LEFT JOIN SRService sr 
                        ON 
                            pr.sr_service_recid = sr.SR_Service_RecID
            LEFT JOIN vService vs 
                        ON 
                            vs.SR_Service_RecID = pr.sr_service_recid
            UNION ALL
            SELECT
                vt.company_name AS [CompanyName],
                vt.SR_Service_RecID AS [Ticket],
                vt.Billable_Hrs * CASE   
                    WHEN 
                        vt.Hourly_Rate < 25 
                    THEN 
                        0.00 
                    ELSE 
                        vt.Hourly_Rate 
                END [Invoice Amount],
                FORMAT(vt.Date_Start, 'MM-yyyy') AS [MO YR],
                FORMAT(EOMONTH(vt.Date_Start), 'dd') AS [MO Days],
                vt.Date_Start AS [WorkDate]
                FROM
                vTime vt
                LEFT JOIN SRService sr 
                    ON  
                        sr.SR_Service_RecID = vt.SR_Service_RecID 
                LEFT JOIN vService vs 
                    ON 
                        vs.SR_Service_RecID = vt.SR_Service_RecID
                LEFT JOIN Product pr 
                    ON 
                        pr.sr_service_recid = vt.SR_Service_RecID
                LEFT JOIN InvoiceHeader ih
                    ON 
                        vt.Invoice_Number = ih.Invoice_Number
                    )union_all
    ORDER BY [WorkDate]

如果您可以在数据集查询中这样做,那么我建议这是最好的选择

为了保持这个答案的简单性,我不会发布存储过程更改的完整代码,但这应该很容易做到

步骤1:向存储过程中添加一个新列,您可以使用该列对数据进行正确排序

FORMAT(vt.Date_Start, 'yyyyMM') AS [YrMoSort]
步骤2:将存储过程的结果转储到临时表中,我们可以在其中计算出所需的附加值

DECLARE @t TABLE ([MO-YR] varchar(7), [YrMoSort] varchar(6), Revenue float)

INSERT INTO @t
    EXEC yourStoredProcNameHere

SELECT 
    *,
     MT3 = SUM(Revenue) OVER(ORDER BY YrMoSort ROWS BETWEEN 2 PRECEDING AND CURRENT ROW),
     MT12 = SUM(Revenue) OVER(ORDER BY YrMoSort ROWS BETWEEN 11 PRECEDING AND CURRENT ROW),
    FROM @t

注意:这假设您的数据中没有空白。如果有,则在执行部分求和之前,您需要填补这些空白,因为它只查找前几行,不知道YrMoSort包含日期信息。

您的数据来自哪里?这通常是您在数据集定义中要做的事情。我的数据来自SQL存储过程。您可以更改存储过程或数据集的源吗?是的,我可以用它做任何我想做的事情,但我希望它可以在SRSS中完成。在SSRS中要做到这一点而不降低性能是非常困难的。你能在你的问题中添加你的程序代码吗?