2014-03-19 56 views
0

我目前正在做一個SUM CASE來鍛鍊一個百分比,但整個字符串返回零或一個(整數),但我不知道爲什麼。我已經寫了部分SQL來分解它,並確保底層數據是正確的,但是當我添加最後一部分來做失敗的百分比時。我錯過了什麼嗎?T-SQL Sum案例混淆

SELECT 
    SUPPLIERCODE, 
    (SUM(CASE WHEN ISNULL(DATESUBMITTED,0) - ISNULL(FAILDATE,0) <15 THEN 1 ELSE 0 END)) AS  ACCEPTABLE, 
    COUNT(ID) AS TOTALSUBMITTED, 
    (SUM(CASE WHEN ISNULL(DATESUBMITTED,0) - ISNULL(FAILDATE,0) <15 THEN 1 ELSE 0 END)/COUNT(ID)) 
FROM SUPPLIERDATA 
GROUP BY SUPPLIERCODE 

例如,以下是一些數據恢復:

SUPPLIERCODE ACCEPTABLE TOTALSUBMITTED Column1 
HBFDE2   1018  1045   0 
DTETY1   4   4    1 
SWYTR2   579   736    0 
VFTEQ3   2104  2438   0 

我知道我可以離開等欄目,並使用Excel的計算,但我寧願不...任何幫助將是很好接收。謝謝

回答

2
SELECT 
    SUPPLIERCODE, 
    (SUM(CASE WHEN ISNULL(DATESUBMITTED,0) - ISNULL(FAILDATE,0) <15 THEN 1 ELSE 0 END)) AS  ACCEPTABLE, 
    COUNT(ID) AS TOTALSUBMITTED, 
    (SUM(CASE WHEN ISNULL(DATESUBMITTED,0) - ISNULL(FAILDATE,0) <15 THEN 1 ELSE 0 END)*1.0/COUNT(ID)) 
FROM SUPPLIERDATA 
GROUP BY SUPPLIERCODE 

您需要將結果轉換爲浮點型。這可以很容易地通過乘以1.0來完成

+0

真棒,我是後期剪輯陳述我的意思寫了只輸出整數...我知道它必須是這樣的,但它是規避我。非常感謝您的回覆! – Palendrone

1

這是由於SQL Server將您的值視爲INT s以用於劃分的事實。 請嘗試以下,你會看到答案0

PRINT 1018/1045 

爲了讓您的操作正常工作,您需要將值轉換爲FLOAT S,就像這樣:

PRINT CAST(1018 AS FLOAT)/1045 

這將按預期產生答案0.974163

一個簡單的改變你的發言,介紹強制轉換爲FLOAT將整理您的問題:

SELECT 
    SUPPLIERCODE, 
    (SUM(CASE WHEN ISNULL(DATESUBMITTED,0) - ISNULL(FAILDATE,0) <15 THEN 1 ELSE 0 END)) AS  ACCEPTABLE, 
    COUNT(ID) AS TOTALSUBMITTED, 
    (CAST(SUM(CASE WHEN ISNULL(DATESUBMITTED,0) - ISNULL(FAILDATE,0) <15 THEN 1 ELSE 0 END) AS FLOAT)/COUNT(ID)) 
FROM SUPPLIERDATA 
GROUP BY SUPPLIERCODE 
0

所有你需要做的就是避免整數除法提出您的數據庫引擎的提示。

在SQL Server中,你可以使用:

SELECT 
    SUPPLIERCODE, 
    (SUM(CASE WHEN ISNULL(DATESUBMITTED, 0) - ISNULL(FAILDATE, 0) < 15 THEN 1 ELSE 0 END)) AS ACCEPTABLE, 
    COUNT(ID) AS TOTALSUBMITTED, 
    (SUM(CASE WHEN ISNULL(DATESUBMITTED, 0) - ISNULL(FAILDATE, 0) < 15 THEN 1 ELSE 0 END)/(COUNT(ID) * 1.0)) 
FROM 
    SUPPLIERDATA 
GROUP BY 
    SUPPLIERCODE