【问题标题】:SSRS get previous totalSSRS 获取之前的总数
【发布时间】:2015-06-16 10:54:10
【问题描述】:

我正在研究 SSRS 2008。一个简单的 tablix,有一个行组(产品)和一个列组(月),在行和列的交叉点是数据(销售数量)。现在我添加一个总行,等于每个月的总和(销售额)。我还添加了一个总列,它等于每个产品的总和(销售数量)。在总行/列的交点处,该值是所有产品和所有月份的销售数量的总和。现在我想将其更改为所有产品的总数,但除上个月外的所有月份。例如。有产品 1、2、3 和第 1、2、3 个月。我想要该单元格中产品 1,2、3 和 1,2 月的总销售额。怎么做?像这张图片,在右下角,应该有 6 个(2 月和 1 月)。

---------更新,添加了创建此报告的脚本,所以也许有人可以尝试一下。

数据集:

    select 'Jan'  as mon, 'p1' as prod, 1 as id
    union all
    select 'Feb'  as mon, 'p1' as prod, 1
    union all
    select 'Mar'  as mon, 'p1' as prod, 1

    union all
    select 'Jan'  as mon, 'p2' as prod, 1
    union all
    select 'Feb'  as mon, 'p2' as prod, 1
    union all
    select 'Mar'  as mon, 'p2' as prod, 1

    union all
    select 'Jan'  as mon, 'p3' as prod, 1
    union all
    select 'Feb'  as mon, 'p3' as prod, 1
    union all
    select 'Mar'  as mon, 'p3' as prod, 1

报告定义:

有一个行组(prod 上的组),一个列组(mon 上的组)。 实际上,我可以在 T-SQL 中做到这一点,方法是在没有上个月的情况下计算总计,然后将其加入主数据集。但只是想知道仅通过 SSRS 是否可以实现。

【问题讨论】:

  • 将适当的 reportItem 值加在一起。
  • 我想不出来到底是怎么回事。能详细点吗?
  • "7:避免在 SSRS 报表级别计算字段 如果报表中有计算字段,那么最好在查询级别而不是在报表级别创建它们,因为数据库可以更好处理计算。这种方法还将减少报表服务器上的报表处理负载和易于维护。 mssqltips.com/sqlservertip/3659/…

标签: reporting-services


【解决方案1】:

在表达式中使用 IIF 从数据集中排除最后 (MAX) 个月的表达式。

=SUM(IIF(Month(Fields!DateField.Value) & "|" & YEAR(Fields!DateField.Value) = 
Month(MAX(Fields!DateField.Value, "Yourdataset")) & "|" & YEAR(MAX(Fields!DateField.Value, "Yourdataset")), 0, Fields!ValueField.Value))

如果月份等于最大月份,它将为 0,否则它将使用您的 ValueField

【讨论】:

  • 试过但得到了这个文本框 xx 的值表达式有一个嵌套聚合,它指定了一个数据集范围。内部聚合不能指定数据集范围。我认为这意味着 max 函数不能不将数据集作为范围。
  • 这是我根据你的使用的表达式: =Sum(iif(Fields!mon.Value = MAX(Fields!mon.Value, "DataSet1"), 0, Fields!ID.Value) )
  • 该错误意味着您不允许将指定数据集的 MAX 放在 SUM 中。作为一种解决方法,使用表达式 =IIF(Fields!mon.Value = MAX(Fields!mon.Value, "DataSet1"), 0, Fields!ID.Value)) 在数据集中添加一个计算字段,然后对列中的该字段求和。
  • 另外,您的 ID 列 (Fields!ID.Value) 有当月的销售数量?
  • 是的,id是销售数量。这是一个测试,所以我没有花时间在命名上。此外,我尝试了计算字段方法并得到另一个错误:用于计算字段的表达式..包括聚合、行数、运行值、上一个或查找函数。 Aggregate、rownumber、runningvalue、previous 和 lookup 函数不能在计算字段表达式中使用。
【解决方案2】:

引用要按名称求和的文本框,作为 reportItems 集合的成员。

在您的示例中,例如,如果您的 tablix 的底行(总计行)具有用于月份列的名为“tbTotal1”、“tbTotal2”、“tbTotal3”的文本框,那么您可以在最后一个文本框仅汇总前两个月的总数:

=ReportItems!tbTotal1.Value + ReportItems!tbTotal2.Value

【讨论】:

  • 该表不是静态表,它有一个列组,所以列数(月)是未知的。所以不能使用 ReportItems。我上传了报告定义,希望有意义。
【解决方案3】:

试试这个:

RunningValue(Fields!totalField.Value,Sum,"DataSourceName")

您可以修改 聚合器(例如使用 Count 而不是 Sum),如果您想在每次迭代中重置该值,您可以通过字词 Nothing 更改 DataSourceName

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多