SQL每日一题(4)

发布于:2025-05-25 ⋅ 阅读:(26) ⋅ 点赞:(0)

前言:第四更 虽然已经全部做完了,这套卷子非常推荐!

根据题目还原出来的原始表

employees表

id name age status
1 张三 28 在岗
2 李四 35 在岗
3 王五 42 在岗
4 赵六 NULL 在岗
5 钱七 58 在岗
6 孙八 24 在岗
7 周九 31 离职
8 吴十 -5 在岗
9 郑十一 45 在岗
10 王十二 52 在岗

 题目1:

查询在岗员工各个年龄段的人数,结果输出年龄段及对应的人数,按年龄段升序排序。
年龄段划分及排序(默认左闭右开):25 岁以下,25 - 30 岁,30 - 35 岁,35 - 40 岁,40 - 45 岁,45 - 50 岁,50 - 55 岁,55 岁及以上,异常情况。
结果输出:年龄段,人数。
备注:异常情况 为空值、异常值等

题目2:

人数第 2 多的年龄段是哪个?对应人数是多少?异常情况有多少人?
填写示例:35 - 40 岁 300 10

题目1:思路 利用case when 语句

SELECT
    CASE
        WHEN age < 25 THEN '25岁以下'
        WHEN age >= 25 AND age < 30 THEN '25-30岁'
        WHEN age >= 30 AND age < 35 THEN '30-35岁'
        WHEN age >= 35 AND age < 40 THEN '35-40岁'
        WHEN age >= 40 AND age < 45 THEN '40-45岁'
        WHEN age >= 45 AND age < 50 THEN '45-50岁'
        WHEN age >= 50 AND age < 55 THEN '50-55岁'
        WHEN age >= 55 THEN '55岁及以上'
        ELSE '异常情况'
    END AS age_group,
    COUNT(*) AS num_people
FROM employees
GROUP BY age_group  -- 使用列别名分组
ORDER BY
    CASE age_group  -- 直接对age_group进行排序
        WHEN '25岁以下' THEN 1
        WHEN '25-30岁' THEN 2
        WHEN '30-35岁' THEN 3
        WHEN '35-40岁' THEN 4
        WHEN '40-45岁' THEN 5
        WHEN '45-50岁' THEN 6
        WHEN '50-55岁' THEN 7
        WHEN '55岁及以上' THEN 8
        ELSE 9
    END;

   题目二:思路将题目1转换为t1表,在对t1表进行row_number()窗口函数进行排序结合order by即可搜索,其他直接查询

查询第二年龄段的人数 

WITH t1 AS (
    SELECT
        CASE ... END AS age_group,
        COUNT(*) AS num_people
    FROM employees
    GROUP BY age_group
),
t2 AS (
    SELECT
        num_people,
        age_group,
        DENSE_RANK() OVER (ORDER BY num_people DESC) AS rk
    FROM t1
)
SELECT 
    num_people,
    age_group
FROM t2
WHERE rk = 2;

查询异常人数 直接从employees表进行查询即可 

SELECT COUNT(*) AS num异常 
FROM employees 
WHERE age IS NULL OR age <= 0;


网站公告

今日签到

点亮在社区的每一天
去签到