我有一个要求,我必须找到不同年龄段的人数,例如:
0-5 12
6-10 35
11-15 26
16-20 57
20+ 120
我正在 SQL Server 中创建一个存储过程,它将首先创建一个临时表并存储年龄组,就像一列将有 0,另一列将有 5,依此类推。然后我将遍历它们并找到最小和最大范围之间的计数,并将带有 mim-max 值的计数存储在另一个临时表中。
有没有其他简单更好的方法来实现这个输出。请指教。
我有一个要求,我必须找到不同年龄段的人数,例如:
0-5 12
6-10 35
11-15 26
16-20 57
20+ 120
我正在 SQL Server 中创建一个存储过程,它将首先创建一个临时表并存储年龄组,就像一列将有 0,另一列将有 5,依此类推。然后我将遍历它们并找到最小和最大范围之间的计数,并将带有 mim-max 值的计数存储在另一个临时表中。
有没有其他简单更好的方法来实现这个输出。请指教。
也许与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]
你的计划基本上是合理的。
拥有一个包含 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
查找您的结果
一般来说,将年龄存储在数据集中是个坏主意。它永远不会准确,并且会逐渐衰减。