SQL Server - 查找范围内的值

时间:2013-08-21 07:47:41

标签: sql sql-server sql-server-2008

我有一个要求,我必须找到不同年龄组的人数,如:

0-5      12

6-10     35

11-15    26

16-20    57

20+      120

我在SQL Server中创建一个存储过程,它将首先创建一个临时表并存储年龄组,就像一列将有0而另一列将有5等等。然后我将循环遍历它们并找到最小和最大范围之间的计数,并将计数与mim-max值存储在另一个临时表中。

还有其他简单而且更好的方法来实现此输出。请指教。

2 个答案:

答案 0 :(得分:6)

可能使用SUMCASE

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

Demo

或者,使用范围表,您可以使用LEFT OUTER JOINGROUP 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

答案 1 :(得分:2)

你的计划基本上是合理的。

使用带有最小和最大列的范围表是一种很好的方法,

 AgeRange       MinAge      MaxAge
 5 and under    0           5
 6-10           6           10
 ...

但不是“循环”,而是应该尝试根据集合和联接进行思考 - 即:加入您的数据集

on data.age between range.minage and range.maxage

并使用group bycount查找结果

通常,在您的数据集中存储年龄是一个坏主意。它永远不会准确并且会逐渐衰退。

相关问题