0

ケース ステートメントを使用して、いくつかの異なる年齢グループの Count(*) を決定していますが、すべての年齢グループの合計に関連するため、各年齢グループのパーセンテージを取得する必要があります。これは初心者の質問であることは知っていますが、行き詰まっています。ありがとうアンディ

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

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

変数 @Total にすべての年齢層の数を入力しようとしています

4

1 に答える 1

0

あなたの質問から、@ 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
于 2012-04-18T04:29:46.267 に答える