Sakila数据库CASE语句客户统计查询写法正确性校验
解答
你当前的思路有部分正确方向,但存在几处明显错误,无法得到正确结果:
- 语法结构错误:
FROM子句位置错误,SELECT后的字段之间缺少逗号分隔,DISTINCT取首字母的写法无法和聚合函数直接配合使用 - 业务逻辑错误:CASE的判断条件写反了,你当前是判断整个姓氏等于'A'/'B',实际CASE应该判断客户的活跃状态,首字母是分组维度,不是CASE的判断条件
- 缺少核心的分组、排序逻辑,无法按首字母维度聚合统计值,也无法满足按字母排序的要求
Sakila示例库中customer表的active字段取值1代表活跃、0代表非活跃,和教材示例的定义一致,符合要求的SQL实现如下,完全使用CASE语句完成统计:
SELECT LEFT(last_name, 1) AS starts_with, SUM(CASE WHEN active = 1 THEN 1 ELSE 0 END) AS active_count, SUM(CASE WHEN active = 0 THEN 1 ELSE 0 END) AS inactive_count FROM customer GROUP BY starts_with ORDER BY starts_with;
逻辑说明:
- 通过
LEFT(last_name, 1)提取姓氏首字母作为分组字段,天然只会返回表中实际存在的首字母,不会生成无数据的额外字母值 - 两个
SUM(CASE...)聚合逻辑分别统计每个首字母分组下的活跃、非活跃客户数,字段别名完全符合要求 - 最后按首字母升序排列,满足按字母排序的输出要求
内容的提问来源于stack exchange,提问作者youthful_bear
相关产品推荐
相关产品推荐

