2017-05-27 1 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] 

と結果:

私の最初のクエリでは、ように見えた私は、case文を使用して比率を計算するCTEでクエリをラップしようとしましたが、私は

Gender  GenderCount 
Female  60620 
Male  394165 
Undisclosed 630007 

女性、男性、非公開のすべてが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

10進数の後に性別の割合を2桁に制限する方法はありますか?それを理解するのに苦労している。 – MISNole

+0

最終結果を10進数(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

関連する問題