2017-05-27 126 views
0

我試圖從我的表格中計算男性和女性的百分比;到目前爲止,我已經計算了女性總數,男性總數以及我的桌子上未公開的數字。但是,我想從這些總數中計算女性和男性的比例。計算分組內的百分比

我的初始查詢看起來像:

SELECT [description] AS [Gender] , 
    COUNT(C.id) AS [GenderCount] 
FROM  dbo.Customers AS [C] 
    INNER JOIN dbo.GenderTypes AS [GT] ON C.genderTypeID = GT.id 
WHERE C.customerStatusTypeID = 'O' 
GROUP BY GT.[description] 

而且結果:

Gender  GenderCount 
Female  60620 
Male  394165 
Undisclosed 630007 

我試圖包裹查詢的CTE來計算使用case語句的百分比,但我m顯然缺少一些東西,因爲女性,男性和未公開的都是100%。

;WITH Gender (Gender, GenderCount) 
AS 
(
SELECT [description] AS [Gender] , 
    COUNT(C.id) AS [GenderCount] 
FROM  dbo.Customers AS [C] 
    INNER JOIN dbo.GenderTypes AS [GT] ON C.genderTypeID = GT.id 
WHERE C.customerStatusTypeID = 'O' 
GROUP BY GT.[description]) 
SELECT Gender.Gender, Gender.GenderCount, 
CASE WHEN 
Gender.Gender = 'Female' THEN Gender.GenderCount/SUM(Gender.GenderCount) * 100 
WHEN Gender.Gender = 'Male' THEN Gender.GenderCount/SUM(Gender.GenderCount) * 100 
ELSE Gender.GenderCount/SUM(Gender.GenderCount) * 100 
END AS [%Gender] 
FROM Gender 
GROUP BY Gender.Gender, Gender.GenderCount; 

下面是結果:

Gender  GenderCount %Gender 
Female  60620   100 
Male   394165   100 
Undisclosed 630007   100 

如果我的數學/ TSQL是正確的,結果應該是這樣的:

Female: 5.59% 
Male: 36.34% 
Undisclosed: 58.08% 

任何人都可以幫助我在我失去了我獲得正確的結果?

回答

1

您可以使用下面的查詢

DECLARE @SampleData AS TABLE 
(
    Gender varchar(20), 
    GenderCount int 
) 

INSERT INTO @SampleData 
VALUES 
('Female', 60620), 
('Male', 394165), 
('Undisclosed', 630007) 

SELECT *, 
     CAST(CAST(sd.GenderCount AS decimal)/sum(sd.GenderCount) over() *100 as decimal(10,2)) AS [%Gender] AS [%Gender] 
FROM @SampleData sd 

返回

Gender GenderCount %Gender 
Female 60620 5.59 
Male 394165 36.34 
Undisclosed 630007 58.08 

你的查詢可以寫成這樣

;WITH temp as (
SELECT [description] AS [Gender] , 
     COUNT(C.id) AS [GenderCount] 
FROM  dbo.Customers AS [C] 
    INNER JOIN dbo.GenderTypes AS [GT] ON C.genderTypeID = GT.id 
WHERE C.customerStatusTypeID = 'O' 
GROUP BY GT.[description] 
) 
SELECT *, 
     CAST(CAST(t.GenderCount AS decimal)/sum(t.GenderCount) over() *100 as decimal(10,2)) AS [%Gender] 
FROM temp t 
+0

真棒 - 我欣賞的幫助。 – MISNole

+0

如何將小數後的性別比例限制在2個位置?努力解決這個問題。 – MISNole

+0

您可以將最終結果轉換爲十進制(10,2).... – TriV

1

你應該能夠做到這一點,而不需要一個CTE:

SELECT SUM(CASE WHEN GT.Gender = 'Female' THEN 1 ELSE 0 END) * 100.00/count(*) as FemalePercent, 
     SUM(CASE WHEN GT.Gender = 'Male' THEN 1 ELSE 0 END) * 100.00/count(*) as MalePercent, 
     SUM(CASE WHEN GT.Gender <> 'Male' AND GT.Gender <> 'Female' THEN 1 ELSE 0 END) * 100.00/count(*) as UndisclosedPercent, 
FROM  dbo.Customers AS [C] 
     INNER JOIN dbo.GenderTypes AS [GT] ON C.genderTypeID = GT.id 
WHERE C.customerStatusTypeID = 'O' 

這會給你一個單獨的行中的3個百分比。

如果您需要在表格格式的結果,你的原始查詢可以加入到另一種給人的記錄總數:

SELECT GC.Gender, 
     GC.GenderCount, 
     GC.GenderCount * 100.00/T.Total as Percentage 
FROM 
(
    SELECT [description] AS [Gender] , 
      COUNT(C.id) AS [GenderCount] 
    FROM  dbo.Customers AS [C] 
      INNER JOIN dbo.GenderTypes AS [GT] ON C.genderTypeID = GT.id 
    WHERE C.customerStatusTypeID = 'O' 
    GROUP BY GT.[description] 
) GC 
cross join 
(
    SELECT Count(*) as Total 
    FROM dbo.Customers C 
    WHERE C.customerStatusTypeID = 'O' 
) T 
+0

這也適用 - 我想比較計劃與上面發佈的答案,看看哪一個在我們的系統上運行得更好,但我很欣賞這個答案。 – MISNole