SQL Server - 查找范围内的数值。

3

我有一个需求,需要统计不同年龄组的人数,例如:

0-5      12

6-10     35

11-15    26

16-20    57

20+      120

我正在SQL Server中创建一个存储过程,首先会创建一个临时表,并将年龄组存储为其中一列,例如一列为0,另一列为5等。然后我会循环遍历它们,并查找最小和最大范围之间的计数,并将计数与最小-最大值存储在另一个临时表中。
请问是否有其他更简单更好的方法来实现此输出?请建议。

你能和我们分享与这些数据相关的表结构吗? - JsonStatham
2个回答

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

演示

或者,使用一个范围表格,您可以使用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


虽然我已经在这里创建了一个单独的帖子来提出这个问题:http://stackoverflow.com/questions/18355311/sql-server-simple-way-to-create-pivot 你能建议如何将列显示为行吗?第一个查询工作得很好,除了它会为每个范围创建一列。我会有100个范围,所以我不想让它们成为单独的列,而是在一列中作为行值。 请给予建议。谢谢! - user1254053
在添加了where子句之后,这个查询语句没有返回所有的范围行。有什么想法,为什么会这样呢? SELECT r.[From], r.[To], [Sum]=SUM(p.Age) FROM dbo.Ranges r LEFT OUTER JOIN dbo.Persons p ON p.[Age] >= r.[From] AND p.[Age] <= r.[To] where YMD BETWEEN '2013-05-03 00:00:00.000' AND '2013-05-03 00:00:00.000' GROUP BY r.[From], r.[To] 这只返回其中可用数据的1行而不是所有行。 - user1254053

2

你的计划基本上是可行的。

拥有一个带有最小值和最大值列的范围表是一个不错的方法,

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

但是,你应该尝试以集合和连接的方式思考,而不是“循环” - 即在你的数据集上进行连接。

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

使用 group bycount 来查找结果。

一般来说,在数据集中存储年龄是一个不好的想法。它永远不会准确,并且会不断降低准确性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接