我有一个要求,我必须找到不同年龄组的人数,例如:
0-5 12
6-10 35
11-15 26
16-20 57
20+ 120我正在Server中创建一个存储过程,它将首先创建一个临时表并存储年龄组,就像一列将有0,而另一列将有5等等。然后循环遍历它们,在min和max范围之间找到计数,并将mim-max值存储在另一个临时表中。
还有其他更简单更好的方法来实现这个输出吗?请给我建议。
发布于 2013-08-21 07:57:56
也许是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.PersonsDemo
或者,使用range表,您可以使用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]Demo
发布于 2013-08-21 08:00:44
你的计划基本上是合理的。
拥有一个包含min和max列的范围表是一种很好的方法,
AgeRange MinAge MaxAge
5 and under 0 5
6-10 6 10
...但是,与其“循环”,你应该尝试从集合和连接的角度来考虑--即:加入您的数据集。
on data.age between range.minage and range.maxage并使用group by和count查找结果
一般来说,在数据集中存储年龄是个坏主意。它永远不会准确,而且会逐渐衰败。
https://stackoverflow.com/questions/18351689
复制相似问题