SQL显示年龄范围

时间:2019-08-22 06:57:10

标签: mysql sql

我正在写一个查询年龄范围的查询,其中我要显示所有年龄段的人数,例如

    AGE   PEOPLE
   "0-10"  0
   "11-20" 2
   "21-30" 5
   "31-40" 0
   "41-50" 1

我尝试使用

SELECT SUM(CASE WHEN age < 10 THEN 1 ELSE 0 END) AS [Under 10],
        SUM(CASE WHEN age BETWEEN 11 AND 20 THEN 1 ELSE 0 END) AS [11-20],
        SUM(CASE WHEN age BETWEEN 21 AND 30 THEN 1 ELSE 0 END) AS [21-30]
 FROM people

但是它将范围显示为列名

   0-10  11-20 21-30 31-40 41-50
     0     2     5     0    1

我不想要。

我也尝试了GROUP BY,但是没有显示计数为0的范围。

4 个答案:

答案 0 :(得分:1)

您的情况应该如下所示

CASE WHEN age < 10 then '0-10'
     when age age BETWEEN 11 AND 20 then '11-20'
     when age BETWEEN 21 AND 30 then '21-30'
     ..... end as agegroup,--put here more according to your need
     count(*)
from table group by agegroup

答案 1 :(得分:0)

您可以使用UNION

SELECT '[Under 10]' as Age, SUM(CASE WHEN age < 10 THEN 1 ELSE 0 END) as People
FROM people
UNION ALL
SELECT '[11-20]', SUM(CASE WHEN age BETWEEN 11 AND 20 THEN 1 ELSE 0 END)
FROM people
UNION ALL
SELECT '[21-30]', SUM(CASE WHEN age BETWEEN 21 AND 30 THEN 1 ELSE 0 END)
FROM people;

答案 2 :(得分:0)

您需要为此执行UNION All

SELECT SUM(CASE WHEN age < 10 THEN 1 ELSE 0 END) AS PEOPLE, 'UNDER 10' AS AGE FROM people
UNION ALL
SELECT SUM(CASE WHEN age BETWEEN 11 AND 20 THEN 1 ELSE 0 END) AS PEOPLE, `11-20` FROM people
UNION ALL
SELECT SUM(CASE WHEN age BETWEEN 21 AND 30 THEN 1 ELSE 0 END) , `21-30` FROM people

您要按行获取一组结果,因此在这种情况下需要执行UNION。 请在MYSQL中找到此链接以获取有关UNION的更多信息。link

答案 3 :(得分:0)

如果要使用UNION,请使用UNION ALL并将条件移至WHERE子句:

SELECT '[Under 10]' as Age, COUNT(*)
FROM people
WHERE age < 10
UNION
SELECT '[11-20]', COUNT(*)
FROM people
WHERE BETWEEN 11 AND 20
UNION ALL
SELECT '[21-30]', COUNT(*)
FROM people
WHERE age BETWEEN 21 AND 30;

过滤和UNION ALL均可提高性能。 (UNION会导致删除重复项的开销。)

还有其他方法。例如,您可以取消枢纽分析表:

SELECT grp.age,
       (CASE grp
            WHEN 1 THEN [Under 10]
            WHEN 2 THEN [11-20]
            WHEN 3 THEN [21-30]
        END)
FROM (SELECT SUM(CASE WHEN age < 10 THEN 1 ELSE 0 END) AS [Under 10]
             SUM(CASE WHEN age BETWEEN 11 AND 20 THEN 1 ELSE 0 END) AS [11-20],
             SUM(CASE WHEN age BETWEEN 21 AND 30 THEN 1 ELSE 0 END) AS [21-30]
      FROM people p
     ) p CROSS JOIN
     (SELECT 1 as grp, '[Under 10]' as age UNION ALL
      SELECT 2 as grp, '[11-20]' as age UNION ALL
      SELECT 3, as grp, '[21-30]' as age
     ) grps;

尽管这看起来更复杂,但从性能的角度来看要好得多,因为它只扫描原始表一次。

还有其他变种,它们只能触摸原始表格一次。