我有一个需求,需要统计不同年龄组的人数,例如:
0-5 12
6-10 35
11-15 26
16-20 57
20+ 120
我正在SQL Server中创建一个存储过程,首先会创建一个临时表,并将年龄组存储为其中一列,例如一列为0,另一列为5等。然后我会循环遍历它们,并查找最小和最大范围之间的计数,并将计数与最小-最大值存储在另一个临时表中。
请问是否有其他更简单更好的方法来实现此输出?请建议。
我有一个需求,需要统计不同年龄组的人数,例如:
0-5 12
6-10 35
11-15 26
16-20 57
20+ 120
SUM
和 CASE
来实现:SELECT [0-5] = SUM(CASE WHEN AGE >= 0 AND AGE <= 5 THEN 1 ELSE 0 END),
[6-10] = SUM(CASE WHEN AGE > 5 AND AGE <= 10 THEN 1 ELSE 0 END),
[11-15] = SUM(CASE WHEN AGE > 10 AND AGE <= 15 THEN 1 ELSE 0 END),
....
FROM dbo.Persons
或者,使用一个范围表格,您可以使用LEFT OUTER JOIN
,GROUP BY
+COUNT
:
SELECT r.[From], r.[To], [Count]=COUNT(p.Age)
FROM dbo.Ranges r
LEFT OUTER JOIN dbo.Persons p
ON p.[Age] >= r.[From] AND p.[Age] <= r.[To]
GROUP BY r.[From], r.[To]
你的计划基本上是可行的。
拥有一个带有最小值和最大值列的范围表是一个不错的方法,
AgeRange MinAge MaxAge
5 and under 0 5
6-10 6 10
...
但是,你应该尝试以集合和连接的方式思考,而不是“循环” - 即在你的数据集上进行连接。
on data.age between range.minage and range.maxage
使用 group by
和 count
来查找结果。
一般来说,在数据集中存储年龄是一个不好的想法。它永远不会准确,并且会不断降低准确性。