2012-04-18 13 views
0

caseステートメントを使用していくつかの異なる年齢グループのCount(*)を決定していますが、各年齢のパーセンテージを取得する必要がありますそれはすべての年齢層の合計に関係するので、 これは初心者の質問ですが、私は立ち往生しています。 ありがとう アンディselectステートメントを使用して変数を設定し、caseステートメントで使用する方法

ここに私が使用しようとしているコードです。

WITH AgeGroups AS ( 
SELECT 
CASE 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) < 21 THEN 'Under 21' 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) BETWEEN 21 AND 29 THEN '21 - 29' 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) BETWEEN 30 AND 39 THEN '30 - 39' 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) BETWEEN 40 AND 49 THEN '40 - 49' 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) BETWEEN 50 AND 59 THEN '50 - 59' 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) > 60 THEN '60 and Over' 
ELSE 'Unkown' 
END AS AgeGroup 
FROM party 
LEFT OUTER JOIN volunteer on partyID = volunteer.partyID 
WHERE volunteer.swornDate BETWEEN @startDate AND @endDate) 
SELECT AgeGroup, COUNT(*) AS AgeGroupCount, Convert(decimal(18,2), 
(1.0*Count(*)/@Total * 100)) as percentage 

FROM AgeGroups 
GROUP BY AgeGroup 

私はあなたの質問から、すべての年齢層

+2

サンプルSQLを投稿できますか?おそらく合計を計算するためにサブクエリを使用し、それからパーセンテージを計算する必要があります。 – mellamokb

+0

2つの質問。 1どのバージョンのmssql? 2なぜあなたはあなたの最後の質問に対する答えを受け入れなかったのですか? –

答えて

0

の数と変数@Totalを埋めるためにしようとしています、あなたが@Totalを埋めるまたはクエリの出力を生成するかどうかは明らかではありません。

これが後であれば、これがうまくいく可能性があります。

WITH AgeGroups AS ( 
SELECT 
CASE 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) < 21 THEN 'Under 21' 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) BETWEEN 21 AND 29 THEN '21 - 29' 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) BETWEEN 30 AND 39 THEN '30 - 39' 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) BETWEEN 40 AND 49 THEN '40 - 49' 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) BETWEEN 50 AND 59 THEN '50 - 59' 
WHEN DATEDIFF(YEAR, party.birthdate, GETDATE()) > 60 THEN '60 and Over' 
ELSE 'Unkown' 
END AS AgeGroup, 
FROM party 
LEFT OUTER JOIN volunteer on partyID = volunteer.partyID 
WHERE volunteer.swornDate BETWEEN @startDate AND @endDate 
) 
SELECT AgeGroup,COUNT(*) AS AgeGroupCount, Convert(decimal(18,2), 
(1.0*Count(*)/b.totcnt * 100)) as percentage 

FROM AgeGroups a, 
(select COUNT(*) AS totcnt from AgeGroups) b 

GROUP BY a.AgeGroup 
+0

ありがとう、それはそれをしました。 Andy –

+0

@andycicchilloその場合は、これをあなたの答えとして選択してください –

関連する問題