前言:第四更 雖然已經全部做完了,這套卷子非常推薦!
根據題目還原出來的原始表
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 語句
SELECTCASEWHEN 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 BYCASE age_group -- 直接對age_group進行排序WHEN '25歲以下' THEN 1WHEN '25-30歲' THEN 2WHEN '30-35歲' THEN 3WHEN '35-40歲' THEN 4WHEN '40-45歲' THEN 5WHEN '45-50歲' THEN 6WHEN '50-55歲' THEN 7WHEN '55歲及以上' THEN 8ELSE 9END;
? ?題目二:思路將題目1轉換為t1表,在對t1表進行row_number()窗口函數進行排序結合order by即可搜索,其他直接查詢
查詢第二年齡段的人數?
WITH t1 AS (SELECTCASE ... END AS age_group,COUNT(*) AS num_peopleFROM employeesGROUP BY age_group
),
t2 AS (SELECTnum_people,age_group,DENSE_RANK() OVER (ORDER BY num_people DESC) AS rkFROM 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;