SSRS矩阵报告表达式的总和

时间:2013-04-12 11:06:40

标签: reporting-services matrix sum expression

我正在尝试创建sum()表达式,该表达式将汇总行并将结果放入“TPM中的总服务器”列中。看起来我无法为sum表达式提供正确的Feed。

设计模式下的SSRS矩阵报告如下所示:

Matrix report picture


[TPM_scan_type]表达式可以有2个值: “TPM Succesfull Scan”或 “TPM失败扫描”

=Switch(Fields!ScanStatus.Value = "OK","TPM Succesfull Scan",Fields!ScanStatus.Value = "FAILED!","TPM Failed Scan")


[scan_count]表达式只是每个“主要SA”的汇总值

=Switch(Fields!ScanStatus.Value="FAILED!",Count(Fields!ScanStatus.Value),Fields!ScanStatus.Value="OK", CountDistinct(Fields!ServerName.Value))


结果:

Report output picture

数据样本:

USE tempdb;
GO

IF OBJECT_ID('dbo.TPM_test') IS NOT NULL
DROP TABLE dbo.TPM_test;
GO

CREATE TABLE dbo.TPM_test
(
ServerName   varchar(30) NOT NULL,
ScanStatus   varchar(10) NOT NULL,
Primary_SA   varchar(30) NOT NULL,
HotfixID     int
);

INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('LDNSQLF700', 'OK', 'SA1', 157848);
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('LDNSQLF700', 'OK', 'SA1', 976832);
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('LDNSQLF700', 'OK', 'SA1', 234354);
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('NYSQL502', 'FAILED!', 'SA1', '');
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('PSQL1011', 'FAILED!', 'SA1', '');
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('NTQDF002', 'OK', 'SA1', 878641);

INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('AUSSQL140', 'OK', 'SA2', 537990);
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('AUSSQL140', 'OK', 'SA2', 1349605);
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('JAP543X2', 'FAILED!', 'SA2', '');
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('EU456CLX', 'FAILED!', 'SA2', '');
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('EUCTX654', 'OK', 'SA2', 5637965);
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('EUCTX654', 'OK', 'SA2', 6464367) ;
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('EUCTX654', 'OK', 'SA2', 1323123) ;
INSERT INTO dbo.TPM_test(ServerName, ScanStatus, Primary_SA, HotfixID)
VALUES('EUCTX654', 'OK', 'SA2', 1004326) ;
GO

1 个答案:

答案 0 :(得分:0)

scan_count 使用CountRows函数而不是Switch语句会更容易吗?

看起来您已经在Matrix中设置了行/列组,因此CountRows只会在其调用的任何范围内执行,并提供您想要的结果。

我创建了一个简单的测试DataSet:

enter image description here

使用此DataSet,我根据您上面的表达式添加了一个计算字段 TPM_scan_type

基于此,我创建了一个标准矩阵:

enter image description here

在每种情况下,屏幕截图中的表达式都只是=CountRows()

另请注意, TPM中的总服务器不在列组范围内。

最终结果:

enter image description here

这看起来像你需要的东西,似乎以更简单的方式做到了。

评论后修改:

好的,我已将DataSet更改为包含确定 ScanStatus 结果的重复行:

enter image description here

我已将 TPM中的总服务器表达式更改为以下内容:

=Count(IIf(Fields!ScanStatus.Value = "FAILED!", Fields!ServerName.Value, Nothing))
    + CountDistinct(IIf(Fields!ScanStatus.Value = "OK", Fields!ServerName.Value, Nothing))

我认为,这给出了所需的结果,与使用这个新数据集的上述报告输出相同。

事实上,这也可以用于 TPM_Scan_Type

最后一个建议 - 是否有任何理由不能只对所有表达式使用=CountDistinct(Fields!ServerName.Value)?如果我了解您的数据,这将提供所需的结果 - 例如,它适用于上述DataSet。

添加数据集后修改:

我已更新报告以使用您的示例数据:

enter image description here

两种表达的结果,即

=Count(IIf(Fields!ScanStatus.Value = "FAILED!", Fields!ServerName.Value, Nothing))
    + CountDistinct(IIf(Fields!ScanStatus.Value = "OK", Fields!ServerName.Value, Nothing))

=CountDistinct(Fields!ServerName.Value)

enter image description here

所以对我来说,似乎你可以在所有情况下使用=CountDistinct(Fields!ServerName.Value)