【问题标题】:Show Totals displayed as column header but not blanks in a matrix report for SSRS显示在 SSRS 的矩阵报告中显示为列标题而非空白的总计
【发布时间】:2012-12-13 00:13:34
【问题描述】:

好的,让我们来解决我遇到的问题,看看是否有人可以帮助我。我正在 SSRS 2012 (VS 2010) 中创建一个矩阵报告。我选择折叠列组并将列的默认“可见性”设置为“隐藏”,并且可以通过文本框进行切换。现在我有了包含状态的行和包含值字段的数据字段。现在 SSRS 的默认设置是在“列组”折叠时汇总数据字段。

第 1 部分问题:

这很好,但是我希望它说:“总计”而不是显示空白。当我将表达式应用于字段时,就像

=IIF(Fields!Code.Value = "", "Totals", Fields!Code.Value)

然后它仅将其应用于我展开的列,而不是总计的父组标题。任何想法如何解决这个问题?

第 2 部分问题:

如果您的数据集的一部分没有您在集合中指定的列,SSRS 的默认设置是显示空白单元格和空白标题。您可以通过单击“列分组”属性轻松解决此问题。单击可见性并将“报表最初运行时:”更改为如下表达式:

=IIF(IsNothing(Fields!Code.Value), false, true)

现在我已经摆脱了我的空白标题和单元格,但现在我在折叠时的主要分组现在已经消失了。

我想要的只是我的数据:

折叠

地点|总数

AL|2

AZ|1

或|

WA|7

扩展

地点|A|B

阿尔| |2

AZ|1 |

或| |

WA|5 |2

分组的默认设置是这样的:

位置|(空白)

AL|2

AZ|1

或|

WA|7

扩展

位置|(空白列)|A|B

阿尔| | |2

AZ| |1|

或| | |

西澳| |5|2

您可以为此示例制作一个简单的测试数据样本,使用您选择的任何数据源加载 SSRS,并为此示例填充一个表变量:

declare @Temp table ( Place char(2), Code char(1), Value int)

insert into @Temp values ('AZ', 'A', 1), ('AL', 'B', 2), ('WA', 'A', 5),('WA','B',2),('OR', null, null)

select *
from @Temp

【问题讨论】:

    标签: reporting-services expression sql-server-2012


    【解决方案1】:

    好吧,基本上我搜索了互联网,发现 SSRS 想要的东西不能等同于存在。 EG:具有空值的标题是问题所在,因为 SSRS 假定您不希望有值的空值,因此当您进行总计时,它希望显示未知数。不过,您可以在后端欺骗它,但这需要一些工作。

    基本上用最简单的术语来说,您希望收集数据并将空值标识为零,以便可以识别它们。因此,我做了一个网格布局,将空值显示为 CTE 中的零,然后我采用该 CTE 并将其取消旋转以恢复我最初拥有的内容。然而,关键的区别是现在 null 的值被表示为零。你可能会说:“但是你的网格上会出现零,我为什么要这样呢?”好吧,您也可以在 SSRS 中执行一些格式化原则来欺骗它。

    让我们看一下我上面的例子,改变一些东西来展示整个过程是如何工作的,我也会添加颜色背景表达式格式,因为这也是人们想要的。

    _1。让我们用我们的代码来展示我们数据集的前后对比。

    SQL 代码

    declare @Temp table ( Place char(2), Code char(1), Value int)
    
    insert into @Temp values ('AZ', 'A', 1), ('AL', 'B', 2), ('WA', 'A', 5),('WA','B',2),('OR', null, null)
    
    select *
    from @Temp
    order by Place
    ;
    
    with a as 
        (
        Select 
            Place
        ,   sum(Case when Code = 'A' then Value else 0 end) as A
        ,   sum(Case when Code = 'B' then Value else 0 end) as B
        from @Temp
        group by Place
        )
    select
        Place
    ,   Code
    ,   Value
    from a
    unpivot(Value for Code in (A, B)) as unpvt1
    order by Place
    

    _2。忽略第一组,但在 SSRS 报告中使用第二组(从 @Temp order by Place 中删除 select *)作为您的数据集

    _3。设置矩阵报表,其中 Place 为行,Code 为列,Value 为数据

    _4。如果现在没有任何内容,则设置一个表达式以隐藏列,方法是右键单击“列组”(应该是代码显示示例)>单击组属性>单击可见性>单击第一部分下的功能选项卡:(您也可以切换如果你想要,就像我在另一个文本单元格上所做的那样)

    =IIF(IsNothing(Fields!Code.Value), false, true)

    _5。单击“代码”列,然后单击其上方的灰色条。单击右侧的插入列,然后用“总计”填充标题,用“[Sum(Value)]”填充单元格,为您提供总计。如果汇总到位,我一生都无法得到一个表达式来显示总计标题不同。此方法仅显示折叠或未折叠的总数。

    _6。现在,如果您预览可能会显示零,我们不希望在所有情况下都这样,所以让我们稍微操作一下文本值。右键单击“代码”下的“值”,然后选择“文本框属性”。单击左侧窗格中的“数字”。选中“将零显示为:”复选框并选择“”(无)。现在你的零已经消失了。

    _7。现在我有了我最初想要的东西,但想根据标题显示的内容对单元格进行动态颜色编码。获取代码标题下单元格值的属性,然后选择“背景颜色”>点击下拉菜单并选择表达式。放入这个表达式:

    =IIF(Fields!Code.Value = "A", "小麦", IIF(FIelds!Code.Value = "B", "LightBlue", "White"))

    我现在可以得到一些东西,由于某种原因,互联网上的大多数人几乎不可能发出声音。我可以将我的列设置为一致的颜色,因为定位现在与一个值相关联,该值作为零存在但现在对最终用户隐藏。

    但你可能会说:“很好,但我想要的是货币价值而不是简单的整数”。我也可以这样做。点击“代码”下的“值”单元格的属性,然后查看“格式”属性。它应该默认为:

    0.00;(0.00);''

    如果你想要钱,那就这样做吧:

    $###,##0;0.00,''

    我希望这对某人有所帮助,如果您说:“这对于小型数据集来说非常棒,但我有一百万或更多行我想做类似的事情。”好吧,我会将我的 cte 替换为临时表或永久表,然后将您的数据转储到内存或永久表中以先对其进行处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-11
      • 2010-12-14
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多