显示数据库表中的动态范围并计算每个范围内的行数

时间:2015-02-27 15:58:25

标签: php mysql sql

我有这样的数据库表:

enter image description here

我想显示不同的5岁年龄范围以及该范围内的学生人数,如下所示:

enter image description here

这里,最低年龄是10岁,所以我们首先计算10-15的范围。该范围内有5名学生。对于第二个范围,我们需要找到年龄≥15的18岁。因此,第二个范围是18-23,依此类推。如果有自动计算范围并计算该范围内的数据,我将不胜感激。

2 个答案:

答案 0 :(得分:7)

您可以使用SUM()语句中的条件来获取该条件所在的计数。我会计算年龄是BETWEEN()必要范围的条件。试试这个:

SELECT 
  SUM(age BETWEEN 10 AND 15) AS '10-15',
  SUM(age BETWEEN 18 AND 23) AS '18-23',
  SUM(age BETWEEN 26 AND 31) AS '26-31',
  SUM(age BETWEEN 34 AND 39) AS '34-39'
FROM myTable;

这只会返回一行,但它会包含您需要的所有内容。这是一个SQL Fiddle示例。

编辑我误解了您的问题以自动计算各种范围。我将在此留下我之前的答案,因为它可能对寻找硬编码范围的未来读者有益。为此,您必须设置变量。我做了一种运行总类型的方法来获得组。我开始在查询之前将@a设置为0。然后,我需要得到两个值:

  • 表格中年龄的最低年龄> @a
  • 5大于该变量。

我是通过根据需要更改@a的值来做到这一点的:

  • @a:=(SELECT MIN(age)FROM myTable WHERE age> = @a)
  • @a:= @a + 5

然后,我将这些值包含在CONCAT()块中,并将这些值作为字符进行转换,以便获取我需要的组。它可能看起来很复杂,所以我希望我解释了这个概念:

SELECT CONCAT
   (CAST(@a := (SELECT MIN(age) FROM myTable WHERE age > @a) AS CHAR), 
   ' - ', 
   CAST((@a := @a + 5) AS CHAR)) AS ageRange
FROM myTable
WHERE @a <= (SELECT MAX(age) FROM myTable);

这样做给了我四行,每行都有你期望的年龄范围。我不得不添加where子句,否则我会为表中的每一行得到一个结果行,这会给我们几个空行。

最后,我添加了一个子查询,以获得年龄在必要范围内的学生的数量。请注意,第一部分更改了@a的值,因此我不是从@a检查到@a + 5,而是从@ a-5检查到@a。这是最终查询:

SET @a = 0;
SELECT CONCAT(CAST(@a := (SELECT MIN(age) FROM myTable WHERE age > @a) AS CHAR), ' - ', CAST((@a := @a + 5) AS CHAR)) AS ageRange,
  (SELECT COUNT(*) FROM myTable WHERE age BETWEEN @a - 5 AND @a) AS numStudents
FROM myTable
WHERE @a <= (SELECT MAX(age) FROM myTable)
GROUP BY ageRange;

它在SQL Fiddle中表现得很漂亮。完全动态并返回5个不同的组,而不知道要采取哪些组。

答案 1 :(得分:4)

SELECT 
   CASE 
      WHEN age>=10 AND age<=15 THEN '10-15' 
      WHEN age>=18 AND age<=23 THEN '18-23' 
      WHEN age>=26 AND age<=31 THEN '26-31' 
      WHEN age>=34 AND age<=39 THEN '34-39'
      ELSE 'OTHER'
   END
   AS age_range,
   COUNT(*) as number_of_students
FROM table
GROUP BY age_range