0

经过一周的谷歌搜索后,我离我的问题的解决方案还差得远,希望有人能提供帮助。如果我已经回答了这个问题,我会提前道歉,尽管我搜索得很努力。

我正在创建一份我们称之为“老年债务人”的报告。此报告的一部分要求我们将去年总计、今年总计以及两者的百分比作为列。另一个要求是将“这一年”(即从今天追溯到1 年前)分成逾期30 天、逾期60 天和逾期90 天以上的帐户。我已返回一个数据集中的所有数据,其中包含以下列

(#) Accounts、Country、AccountType、OverdueAmount、OverdueTime(30、60、90 和去年)和 YearGroup(今年为 TY,去年为 LY)

我创建了 2 个行组(国家和帐户类型(国家的子组)和 2 个列组(总逾期和逾期时间 - 彼此无关...逾期时间将金额分成 30、60 90天等,而总逾期给我去年和今年的数字)

Total Overdue 使用以下方法在组中的 2 列之间拆分

=format(iif(Fields!YearGroup.Value = "LY",Sum(Fields!OverdueAmount.Value), iif((Fields!YearGroup.Value = "TY"), Sum(Fields!OverdueAmount.Value), 0)), "C")

这很好用!我的问题是客户然后想要一个列旁边的列,基本上为他做了一个百分比 - 总和(今年 - 去年)/去年。所以基本上我想要这个布局

去年,今年,百分比

我尝试在组中创建另一列,但是这只是在前面的每个列旁边插入了一个新列,所以我最终得到了

去年,专栏,今年,专栏

然后我尝试在组旁边创建一个列,并使用“AccountType”行的范围和 iif 语句来区分去年和今年

 (iif(Fields!YearGroup.Value = "TY", sum(overdueamount.value), 0) -iif(fields!YearGroup.Value = "LY", sum(overdueamount.value), 0)

试图得到一个基本的区别,它似乎想把所有的东西都加起来——一个例子是

Last year = $200
This Year = $100

差价应该是 100 美元 - RS 告诉我是 300 美元!

(我已经尝试了无数次迭代,包括嵌套上面的 iif 语句)

无论 YearGroup 的值是多少,它似乎都在汇总所有内容 - 我感觉这就是 RS 呈现组的方式 - 如果其中一个年份值为 0(假设去年有 200 美元的帐户类型,而今年有$0) 然后它“似乎”也在做我想做的事。

我曾考虑在 SQL 中执行此操作,但我认为返回一个数据集太复杂了(我现在已经在做一些疯狂的联合以将其全部放入一个 DS 中)。

有没有办法根据组中 2 个动态创建的列之间的差异计算出 % 值?如果需要,很高兴尝试提供更多详细信息...

4

3 回答 3

1

我认为您需要在 Sum 函数中移动 iif 逻辑,如下所示:

= sum( iif(Fields!YearGroup.Value = "TY", overdueamount.value 
, iif(fields!YearGroup.Value = "LY", 0 - overdueamount.value , 0) ) )

BTW SSRS 2008+ 通过 ReportItems 集合优雅地解决了这一挑战......

于 2013-01-07T10:49:11.563 回答
0

首先感谢迈克让我走上正确的道路!我意识到我需要对分区的第二部分进行转换,现在它运行良好!

干杯,我希望这个问题和这些答案对其他人有所帮助 - 经过 2 周的斗争,我终于可以把它放到床上了!

于 2013-01-08T05:43:24.723 回答
0

在 SQL 中这样做实际上相当简单,使用 PARTITION:

SELECT DISTINCT
    CASE
        WHEN DatePart(Year, INV.DueByDate) = DatePart(Year, GetDate()) - 1 THEN 'Last Year'
        ELSE 'This Year'
    END YearGroup,
    SUM(INV.AmountDue) OVER(PARTITION BY    CASE
                                                    WHEN DatePart(Year, INV.DueByDate) = DatePart(Year, GetDate()) - 1 THEN 'Last Year'
                                                    ELSE 'This Year'
                                                END) TotalAmountOverDue,
    SUM(INV.AmountDue) OVER(PARTITION BY    CASE
                                                    WHEN DatePart(Year, INV.DueByDate) = DatePart(Year, GetDate()) - 1 THEN 'Last Year'
                                                    ELSE 'This Year'
                                                END) / Sum(INV.AmountDue) OVER() * 100 Percentage

FROM Invoice INV

WHERE INV.DueByDate >= '1/1/2012'
于 2013-03-24T02:40:32.793 回答