2013-04-12 127 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