好的,所以基本上我搜索了互联网,发现 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(字段!Code.Value),假,真)
_5。单击“代码”列,然后单击其上方的灰色条。单击右侧的插入列,然后用“总计”填充标题,用“[Sum(Value)]”填充单元格,为您提供总计。如果汇总到位,我一生都无法得到一个表达式来显示总计标题不同。此方法仅显示折叠或未折叠的总数。
_6。现在,如果您预览可能会显示零,我们不希望在所有情况下都这样,所以让我们稍微操作一下文本值。右键单击“代码”下的“值”,然后选择“文本框属性”。单击左侧窗格中的“数字”。选中“将零显示为:”复选框并选择“”(无)。现在你的零已经消失了。
_7。现在我有了我最初想要的东西,但想根据标题显示的内容对单元格进行动态颜色编码。获取代码标题下单元格值的属性,然后选择“背景颜色”>点击下拉菜单并选择表达式。放入这个表达式:
=IIF(字段!Code.Value = “A”,“小麦”,IIF(字段!Code.Value = “B”,“LightBlue”,“White”))
我现在可以得到一些东西,由于某种原因,互联网上的大多数人听起来几乎不可能。我可以将我的列设置为一致的颜色,因为定位现在与一个值相关联,该值作为零存在但现在对最终用户隐藏。
但你可能会说:“很好,但我想要的是货币价值而不是简单的整数”。我也可以这样做。点击“代码”下的“值”单元格的属性,然后查看“格式”属性。它应该默认为:
0.00;(0.00);''
如果您想要钱,请改为:
$###,##0;0.00,''
我希望这对某人有所帮助,如果您说:“这对于小型数据集来说非常有用,但我有一百万或更多行我想做类似的事情。” 好吧,我会将我的 cte 替换为临时表或永久表,然后将您的数据转储到内存或永久表中以首先对其进行按摩。