显示总计显示为列标题,但不显示在SSRS的矩阵报告中的空白

时间:2012-12-13 00:13:35

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

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

第1部分问题:

这很好,但是我想说:'总计'而不是显示空白。当我将一个表达式应用于该字段时,就像

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

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

第2部分问题:

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

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

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

我想要的只是我的数据:

COLLAPSED

放置|共(S)

AL | 2

AZ | 1

或|

WA | 7

EXPANDED

地点| A | B

AL | | 2

AZ | 1 |

或| |

WA | 5 | 2

分组的缺点就像这样:

地点|(BLANK)

AL | 2

AZ | 1

或|

WA | 7

扩展

放置|(BLANK COLUMN)| A | B

AL | | | 2

AZ | | 1 |

或| | |

WA | | 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

1 个答案:

答案 0 :(得分:0)

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

基本上,在最简单的术语中,您希望获取数据集并将空值标识为零,以便可以识别它们。因此我做了一个网格布局来计算空值然后在CTE中显示为零,然后我接受CTE并取消它以基本上恢复我原来的。但是现在的关键区别在于空值的值表示为零。你可能会说:“但是你的网格上会出现零,我为什么要这样做呢?”那么你可以在SSRS中做一些格式化原则来欺骗它。

让我们来看看上面的例子并更改一些内容以显示整个过程是如何工作的,我也会添加颜色背景表达格式,因为这也是他人想要的。

_1。让我们使用我们的代码并显示数据集的前后。

SQL CODE

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报告中使用第二组(从地方删除s​​elect * from @Temp顺序)作为数据集

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

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

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

_5。单击“代码”列,然后单击其上方的灰色栏。单击右侧的插入列,然后使用“总计”填充标题,使用“[总和(值)]”填充单元格以显示总计。我不能为我的生活得到一个表达式,以显示总计标题不同,如果它总结到位。此方法仅显示总计折叠与否。

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

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

= IIF(Fields!Code.Value =“A”,“Wheat”,  IIF(FIelds!Code.Value =“B”,“LightBlue”,“White”))

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

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

0.00;(0.00); ''

如果你想要钱,请改为:

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

我希望这可以帮助别人,并且如果你说的话也要记住:“这对于小型数据集来说非常好,但是我有一百万或更多行我想做这样的事情。”好吧,我会将我的cte替换为临时表或永久表,并将数据转储到内存或永久表中以便先按下它。