SQL踩坑:计算函数or聚合函数的字段平级,导致分辨不出彼此的别名问题
2023-04-18 14:42:53 时间
问题1:SUM()函数使用小技巧
错误案例:
-- 统计学校表school中性别字段student_sex(student_sex取值为girl或者boy)的女生总人数
SUM(student_sex = "girl") AS "女学生总数"; -- 这里会报错,SUM函数的参数不正确
复制代码
解决方式:
SUM(CASE WHEN student_sex = 'girl' THEN 1 ELSE 0 END) AS girls, -- 女生总数
复制代码
问题2:计算函数or聚合函数的字段平级,导致分辨不出彼此的别名问题
错误案例:
SELECT
COUNT(*) AS total, -- 学校的学生总数
SUM(CASE WHEN student_sex = 'girl' THEN 1 ELSE 0 END) AS girls, -- 计算女生总数
SUM(CASE WHEN student_sex = 'boy' THEN 1 ELSE 0 END) AS boys, -- 计算男生总数
(sch.boys / stu.total) AS "学校中男生所占的比例"
FROM
school sch -- 从学校表中查询
GROUP BY
student_grade; -- 按照年级分组
复制代码
如果使用这种方式去查询,会出现如下报错问题:
Semantic analysis exception - column stu.boys cannot be resolved
复制代码
错误原因是stu.boys
字段不能被解析,SUM()
函数计算出school表中所有男生的总数,并为其其别名为boys
。 注意:这里的别名和表的别名sch
是同级别的,所以不可以使用sch.boys
的方式去获得学校男生的总数量!
解决方案:
两层SELECT嵌套查询。
SELECT
S.total AS "学生总数",
S.boys AS "男生总数",
S.girls AS "女生总数",
(S.boys / S.total) AS "学校中男生所占的比例"
FROM
(
SELECT
COUNT(*) AS total,
SUM(CASE WHEN student_sex = 'girl' THEN 1 ELSE 0 END) AS girls, -- 计算女生总数
SUM(CASE WHEN student_sex = 'boy' THEN 1 ELSE 0 END) AS boys, -- 计算男生总数
FROM
school sch -- 从学校表中查询,表别名为sch
GROUP BY
student_grade; -- 按照年级分组
) S;
复制代码
这样就可以正常查询啦!
相关文章
- 直接在代码里面对list集合进行分页
- .NET Framework 4.5新特性详解
- 大数据的简要介绍
- 大数据的由来
- 高斯混合模型的自然梯度变量推理
- timing-wheel 仿Kafka实现的时间轮算法
- 使用Navicat软件连接自建数据库(Linux系统)
- 那一天,我被Redis主从架构支配的恐惧
- Redis 深入了解键的过期时间
- C#使用委托调用实现用户端等待闪屏
- 基于流计算 Oceanus 和 Elasticsearch Service 构建百亿级实时监控系统
- GRAND | 转录调控网络预测数据库
- JFreeChart API中文文档
- 临床相关突变查询数据库
- TIGER | 人类胰岛基因变化查询数据库
- 视频边缘计算网关EasyNVR在视频整体监控解决方案中的应用分析
- Apache Arrow - 大数据在数据湖后的下一个风向标
- 常见的电商数据指标体系
- AKShare-艺人数据-艺人流量价值
- MySQL中多表联合查询与子查询的这些区别,你可能不知道!