2016-05-06 22 views
2

我完全停留在編寫SQL代碼來處理任務的最佳方式,我必須生成報告。我們使用Sybase ASA。它嵌入了一個應用程序。查詢需要產生以下輸出:當條件存在時加起來的所有事件

媒體服務器|備份總數|卷大小(KB)|平均吞吐量|成功數量|工作成功%

每個媒體服務器將是唯一的。

我遇到了成功的工作數量然後確定成功率的問題。

這裏是我的代碼:

SELECT 
    dmj.name AS "Media Server", 
    CAST(SUM(dj.bytesWritten/1024/1024) as decimal(20,2)) as "Volume(MB)", 
    COUNT(distinct dj.id) AS "Total Number of Jobs", 
    CAST(AVG(dj.throughput) as decimal(10,2)) AS "Throughput (KB/sec)", 
    CASE 
     WHEN dj.statusCode = '0' 
     THEN COUNT (dj.statusCode) 
    END AS "Number of Successful Jobs" 
FROM domain_JobArchive dj 
INNER JOIN domain_MediaServer dmj 
ON dj.mediaServerName = dmj.name 
WHERE DATEDIFF(day, UtcBigIntToNomTime(dj.endTime), GETDATE()) <= 7 
    AND dj.Type != '17' 
    AND dj.statusCode = 0 
GROUP BY dmj.name, dj.statusCode 

我也仍然不確定如何展現成功的%。

我們使用Sybase ASA,因爲它嵌入在應用程序中。

感謝。

+0

我不知道是什麼導致問題是statusCode的一部分。含有聚合物的CASE將會起作用嗎?該案件每行都在運行,但總計超過了行數:我認爲這不會起作用。 你可能需要的是SUM(CASE當dj.statusCode ='0',然後1 else 0結束)來獲得成功次數。成功的百分比是該表達式除以COUNT(*)。 –

+0

好點安倍。我不知道CASE如何處理數據。我會試試看看它會產生什麼。 – Opethian

+0

我將如何顯示百分比計算的代碼?它會像這樣:SUM(CASE WHEN dj.statusCode ='0' THEN COUNT(dj.statusCode) END/COUNT(*))AS「Success%」 – Opethian

回答

0

因此,它是:

SUM(CASE when dj.statusCode = '0' then 1 else 0 end) 

獲得成功的次數,以及:

SUM(CASE WHEN dj.statusCode = '0' THEN 1 else 0 END) * 100.0/ COUNT(*) 

得到的百分比成功 - 像以前一樣,你不會得到你想要骨料什麼在這種情況下CASE表達式中的COUNT(*)函數的功能(我認爲Sybase會接受,但您會得到總計COUNT,我認爲打破GROUP BY - 不要在此處執行此操作)。

You有一個furt她的問題 - 你爲什麼按statusCode分組?應該這樣做,因爲您正在查看每臺Media Server的所有作業,而不是在成功/失敗之間將它們分開,而是計算成功/失敗率的統計數據。所以只需將服務器名稱分組。

而且這是什麼:

COUNT(distinct dj.id) 

我還以爲你有一個獨特的名單已經 - 如果你需要做的,它表明你對我已經有了每個作業多行,使將打破你的統計。

ALSO:

WHERE DATEDIFF(day, UtcBigIntToNomTime(dj.endTime), GETDATE()) <= 7 
AND dj.Type != '17' 
AND dj.statusCode = 0 

你限制對成功就業!我認爲你應該重新開始 - 首先執行sql來選擇作業,確保它是正確的。如果你需要失敗率,你也必須選擇失敗。 然後,使用SUM(CASE ..)技術來計算您需要的結果GROUPing BY。 我認爲你需要再次仔細地建立查詢,因爲目前有太多的問題。

+0

感謝您的澄清。完全讚賞。根據你的附加筆記,我可以刪除「獨特」。我還遺漏了代碼「dj.statuscode = 0」。發佈前我正在測試一些東西。再一次,謝謝安倍。 – Opethian

+0

如果允許,你可以註冊嗎? –

相關問題