2017-09-19 110 views
0

我認爲這是一個奇怪的四捨五入問題,但我不知道內部的SQL是如何工作的。所以也許有人可以幫忙。獲取數字的百分比

SELECT COUNT(Id) TotalReferrals, 
    SUM(CASE WHEN NHSCommunicationNeed1_Id IS NOT NULL THEN 1 ELSE 0 END) NHSCommNeed1Total, 
    SUM(CASE WHEN NHSCommunicationNeed2_Id IS NOT NULL THEN 1 ELSE 0 END) NHSCommNeed2Total, 
    SUM(CASE WHEN NHSCommunicationNeed3_Id IS NOT NULL THEN 1 ELSE 0 END) 
    NHSCommNeed3Total 
    INTO #Totals 
    FROM DDS.Referrals 

給我下面的結果集

TotalReferrals NHSCommNeed1Total NHSCommNeed2Total NHSCommNeed3Total 
1008   1008    508     508 

後來,當我做到這一點

SELECT 
    SUM((NHSCommNeed1Total/TotalReferrals) * 100) NHSCommNeed1Percent, 
    SUM((NHSCommNeed2Total/TotalReferrals) * 100) NHSCommNeed2Percent, 
    SUM((NHSCommNeed3Total/TotalReferrals) * 100) NHSCommNeed3Percent 
FROM #Totals 

我得到這個?

NHSCommNeed1Percent NHSCommNeed2Percent NHSCommNeed3Percent 
100     0     0 

有人能解釋這是怎麼回事,如何解決它

回答

2

NHSCommNeed1Total/(TotalReferrals結果的計算公式爲整數,因此它最終以0要強制使其小數或雙只是乘以與1.0

SELECT 
    SUM((NHSCommNeed1Total/(TotalReferrals * 1.0)) * 100) NHSCommNeed1Percent, 
    SUM((NHSCommNeed2Total/(TotalReferrals * 1.0)) * 100) NHSCommNeed2Percent, 
    SUM((NHSCommNeed3Total/(TotalReferrals * 1.0)) * 100) AS NHSCommNeed3Percent 
FROM #Totals 

是肯定的,沒有必要兩個語句,你可以使用INSERT INTO SELECT

WITH CTE 
AS 
(
    SELECT COUNT(Id) TotalReferrals, 
     SUM(CASE WHEN NHSCommunicationNeed1_Id IS NOT NULL THEN 1.0 ELSE 0 END) NHSCommNeed1Total, 
     SUM(CASE WHEN NHSCommunicationNeed2_Id IS NOT NULL THEN 1.0 ELSE 0 END) NHSCommNeed2Total, 
     SUM(CASE WHEN NHSCommunicationNeed3_Id IS NOT NULL THEN 1.0 ELSE 0 END) 
     NHSCommNeed3Total 
     FROM DDS.Referrals 
) 
INSERT INTO SomeOtherTable(NHSCommNeed1Total,NHSCommNeed2Total ,NHSCommNeed3Total) 
SELECT 
    SUM((NHSCommNeed1Total/(TotalReferrals * 1.0)) * 100) AS NHSCommNeed1Percent, 
    SUM((NHSCommNeed2Total/(TotalReferrals * 1.0)) * 100) NHSCommNeed2Percent, 
    SUM((NHSCommNeed3Total/(TotalReferrals * 1.0)) * 100) AS NHSCommNeed3Percent 
FROM CTE; 
+0

感謝。有什麼辦法可以合併這兩個語句,所以我不必插入到#Totals中,只需查詢DDS。參考 –

+0

而不是插入它們,將第一個查詢換成另一個select,並在那裏進行聚合。 @BenDonnelly – sagi

+0

或者他們可以用'THEN 1.0 ELSE 0 END'在'CASE'表達式中修復它。 –

0

如果你想要一個都在一個聲明中這應該工作

SELECT 
SUM(CASE WHEN NHSCommunicationNeed1_Id IS NOT NULL THEN 1.0 ELSE 0.0 END)/COUNT(Id) as NHSCommNeed1Percent, 
SUM(CASE WHEN NHSCommunicationNeed2_Id IS NOT NULL THEN 1.0 ELSE 0.0 END)/COUNT(Id) as NHSCommNeed2Percent, 
SUM(CASE WHEN NHSCommunicationNeed3_Id IS NOT NULL THEN 1.0 ELSE 0.0 END)/COUNT(Id) as NHSCommNeed3Percent 
FROM DDS.Referrals