2012-04-18 93 views
0

我正在使用case语句来确定几个不同年龄段的Count(*),但我需要获取每个年龄段的百分比因为它涉及所有年龄组的总数。 我知道这是一个新手问题,但我卡住了。 谢谢 Andy如何使用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 2012-04-18 03:03:26

+0

2个问题。 1哪个版本的mssql? 2为什么你不接受你最后一个问题的答案? – 2012-04-18 10:35:01

回答

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 – 2012-04-18 12:16:07

+0

@andycicchillo在这种情况下,选择了这个作为你的答案 – 2012-04-18 12:48:20