2012-07-12 186 views
0

我希望每個id_cerinta返回分組的百分比,怎麼樣的subcerinteProiect記錄的很多都是根據它們被計算百分比0

enter image description here

分組的 id_sarcinaacoperire= 'acoperita'除以所有 subcerinteProiect錄音

我想是這樣的:

SELECT 
    id_cerinta, 
    SUM(CASE WHEN acoperire = 'acoperita' THEN 1 ELSE 0 END) 
     /COUNT(*) * 100 AS nr_subcerinte_acoperit 
FROM 
    subcerinteProiect 
GROUP BY 
    id_cerinta 

但它不工作太好。它只返回0 ..

回答

2

這是由於整數數學。試試這些:

SELECT 5/100, 57/100, 99/100; 

結果均爲0

現在試試:

SELECT 5.0/100, 57.0/100, 99.0/100; 

更好的成績,對不對?

因此,對於你的查詢:

SELECT 
    id_cerinta, 
    CONVERT(DECIMAL(5,2), 
     SUM(CASE WHEN acoperire = 'acoperita' THEN 1 ELSE 0 END) 
      /COUNT(*) * 100.0) AS nr_subcerinte_acoperit 
FROM 
    subcerinteProiect 
GROUP BY 
    id_cerinta 
+0

我也這麼認爲,但結果是現在,0.00 ....所有...我不知道問題在哪裏...我有acoperire ='acoperita .... – TBogdan 2012-07-12 16:02:25

+0

@TBogdan你* COPY *我的查詢,還是你編輯你現有的查詢與你可能會或可能沒有注意到的變化?你是否改變了第三行來使用'100.0'而不是'100'? – 2012-07-12 16:07:11

+0

是的,我做了,我試過兩種方法,複製和編輯... – TBogdan 2012-07-12 16:09:39

1

MSDN解釋這種行爲here

如果一個整數股息進行整除數劃分的結果是 整數有任何結果的小數部分截斷

此外,100INT埃格爾常數:

SELECT DataType = SQL_VARIANT_PROPERTY(100, 'BaseType'), 
     Precision = SQL_VARIANT_PROPERTY(100, 'Precision'), 
     Scale  = SQL_VARIANT_PROPERTY(100, 'Scale'); 

結果:

DataType Precision Scale 
-------- --------- ----- 
int  10  0 

而且here MSDN說* (Multiply)

返回的數據類型AR有更高的優先權。有關 的更多信息,請參閱Data Type Precedence (Transact-SQL)

intint是... int之間優先級數字數據類型。

所以SUM/COUNT = int(in this case)/int = int

SUM/COUNT * 100 = int * int = int

該解決方案由Aaron提供。