【问题标题】:Reporting Services 2005 Caculating the percentage on columns in a single groupReporting Services 2005 计算单个组中列的百分比
【发布时间】:2013-01-07 05:33:51
【问题描述】:

经过一周的谷歌搜索,我还没有找到解决问题的方法,希望有人能提供帮助。如果这个问题已经得到解答,我提前道歉,尽管我搜索得很辛苦。

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

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

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

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 个动态创建的列之间的差异计算出 % 值?如果需要,很高兴尝试提供更多详细信息...

【问题讨论】:

    标签: sql-server reporting-services reportingservices-2005


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 Mike 给了我今年和去年之间的差异,但是现在分歧导致了问题 - 见下文 = (sum( iif(Fields!YearGroup.Value = "TY", Fields!OverdueAmount.值 , iif(fields!YearGroup.Value = "LY", 0 - Fields!OverdueAmount.Value , 0) ) )) / (sum(iif(Fields!YearGroup.Value = "LY", Fields!OverdueAmount.Value, 0 ) ) ) 去年和今年都有价值的地方我得到#errors :-(
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      使用 PARTITION 在 SQL 中执行此操作实际上相当简单:

      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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 2021-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多