2015-04-06 169 views
3

我使用SQL Server 2014和我有一個運行正常以下查詢:SQL語法總和計數列計算百分比分佈

USE MyDatabase 

SELECT [Room Nights], 
     COUNT([Room Nights]) AS 'Count of RN' 
FROM HOLDINGS2 
GROUP BY [Room Nights] 

輸出如下:

Room Nights  Count of RN 
1     3 
4     10 
5     6 
7     25 

現在我想顯示另一列給出Count of RN的百分比分佈。因此,我的輸出需要是這樣的:

Room Nights  Count of RN % Distribution 
    1     3   6.8 
    4     10   22.7 
    5     6   13.6 
    7     25   56.8 

我看看下面的討論,試圖找出一個解決方案: percent distribution with counted values

我想出了對現有代碼的以下修改,但它不起作用! % Distribution列中只有零。

USE MyDatabase 

SELECT [Room Nights], 
     COUNT([Room Nights]) AS 'Count of RN', 
     CAST(COUNT([Room Nights])/(SELECT COUNT([Room Nights])*100. FROM HOLDINGS2) AS DECIMAL (9,0)) AS '% Distribution' 
FROM HOLDINGS2 
GROUP BY [Room Nights] 

基本上,% Distribution柱應採取Count of RN和由TOTAL Count of RN劃分它。

回答

4

這會工作:

select [Room Nights], 
    count([Room Nights]) AS 'Count of RN', 
    cast(
    (count([Room Nights]) 
    /
    (Select Count([Room Nights]) * 1.0 from HOLDINGS2) 
    ) * 100 as decimal(6,1) 
) as '% Distribution'  
FROM HOLDINGS2 
GROUP BY [Room Nights] 

在子查詢勢力浮點除法的* 1.0,外投限制的精度。

或者,因爲你正在使用MSSQL的現代版,您可以使用窗口功能:

cast(count([Room Nights])/(sum(count([Room Nights])*1.0) over()) * 100 as decimal(6,1)) 
+0

這個,或者添加一個內部演員給分子或分母。我修改了ughai的原始答案*首先*將計數轉換爲十進制*然後*除以總數,這是有效的 - 但給你很大的精度,所以你需要四捨五入或有一個外部演員。 – Boris 2015-04-06 11:38:53

+0

@jpw,只是一個小缺陷。你缺少條款組 – 2015-04-06 11:58:55

+0

@GiorgiNakeuri感謝您的注意,忘記複製該。 – jpw 2015-04-06 12:15:25

1

您可以使用窗口函數計算% Distribution,通過100.0乘強迫的結果是float然後逗號後把一切都高達1位:

select [Room Nights] 
     , count([Room Nights]) as [Count of RN] 
     , cast(100.0 * count([Room Nights])/(sum(count([Room Nights])) over()) as decimal(6,1)) as [% Distribution] 
from HOLDINGS2 
group by [Room Nights] 

SQLFiddle

你可以還使用子查詢:

select [Room Nights] 
    , count([Room Nights]) as [Count of RN] 
    , cast(100.0 * count([Room Nights])/(select count([Room Nights]) from HOLDINGS2) as decimal(6,1)) as [% Distribution] 
from HOLDINGS2 
group by [Room Nights] 

SQLFiddle

+0

您需要將分佈轉換爲十進制或數字以獲得具有精度點的分佈百分比。 – ughai 2015-04-06 11:20:46

0

嘗試這樣的事情

select [Room Nights], 
     count([Room Nights]) AS 'Count of RN', 
     (CONVERT(DECIMAL(9,2),count([Room Nights]))/(Select Count([Room Nights]) from HOLDINGS2))*100 as '% Distribution' 
FROM HOLDINGS2 
GROUP BY [Room Nights] 
+0

我認爲你最後沒有括號。無論如何,它仍然讓我在這個專欄的任何地方都是零。 – user3115933 2015-04-06 11:25:03

+0

我錯過了一開始。現在試試。 – ughai 2015-04-06 11:26:13

1

嘗試:

DECLARE @t TABLE 
    (
     [Room Nights] INT , 
     [Count of RN] INT 
    ) 

INSERT INTO @t 
VALUES (1, 3), 
     (4, 10), 
     (5, 6), 
     (7, 25) 


SELECT * , 
     ROUND([Count of RN] * 100.0 
      /SUM([Count of RN]) OVER (ORDER BY (SELECT NULL)), 1) AS [Percent] 
FROM @t   

輸出:

Room Nights Count of RN Percent 
1   3   6.800000000000 
4   10   22.700000000000 
5   6   13.600000000000 
7   25   56.800000000000 

編輯:我我錯過了RN的Count是分組查詢的結果。這裏是修改語句:

SELECT [RN] , 
     COUNT(S) AS C , 
     CAST(COUNT(S) * 100.0/SUM(COUNT(S)) OVER() AS DECIMAL(10, 1)) AS [Percent] 
FROM @t 
GROUP BY [RN] 
+0

[RN的計數]是查詢的結果,而不是源的一部分。當然,您可以將第一個查詢作爲cte或派生表來運行。 – jpw 2015-04-06 11:39:25

+0

@jpw,thx,錯過了 – 2015-04-06 11:48:14