2013-04-12 129 views
1

我正在尝试创建sum()表达式,它将总结行并将结果放入“TPM中的总服务器”列中。看起来我无法提供合适的表达式。在设计模式中SSRS矩阵报表总和表达式

SSRS矩阵报告如下所示:

Matrix report picture


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

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


[scan_count]表达式只是每个“Primary 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 

回答

0

不会容易,只需使用CountRows功能,而不是一个Switch语句SCAN_COUNT

看起来您已经在您的Matrix中设置了行/列组,因此CountRows只会在您调用的任何Scope中执行并给出您想要的结果。

我创建一个简单的测试数据集:

enter image description here

有了这个数据集I加入计算字段基于TPM_scan_type您的表达的上方。

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

enter image description here

在每种情况下在屏幕截图的表达式仅仅是=CountRows()

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

最终结果:

enter image description here

这看起来像你需要什么,似乎做一个简单的方法。评论后

编辑:

OK,我已经改变了数据集,包括重复的行为OKScanStatus结果:

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

这给出了所需的结果,我认为,与上述新的DataSet报表输出相同。

实际上,这也可以用于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)

+0

如果我的示例对我的示例没有用处,可以添加一个半行数据集示例数据集吗?另外,你能解释为什么你使用'Count(Fields!ScanStatus.Value)'失败,'CountDistinct(Fields!ServerName.Value)'成功? –

+0

Hi @ Ian。感谢你及时的答复。 CountRows()可以部分完成这项工作,但是我拥有的数据集迫使我使用开关。这完全是因为Fields!ScanStatus可以为服务器提供两个值:“失败!”或“确定”。但“失败!”是独一无二的价值(针对每台机器),与“OK!”相反对于每个服务器重复几次(因为扫描返回服务器上缺失的修补程序)。所以我需要区分“OK”值来获得扫描成功的服务器的数量。 – Mario

+0

我把数据样本放在上面的SQL表中。关于您之前问过的问题:“您能解释为什么您使用... CountDistinct(Fields!ServerName.Value)取得成功吗?”失败有独特的价值,所以我只是通过“Count(Fields!ScanStatus.Value)”来统计它们。我不能通过“OK”状态进行聚合,因为我只在每行中获得一个,所以我使用serverName来完成这项工作。 – Mario