SQL踩坑:计算函数or聚合函数的字段平级,导致分辨不出彼此的别名问题

举报
兴趣使然的草帽路飞 发表于 2021/12/05 23:30:31 2021/12/05
【摘要】 问题1:SUM()函数使用小技巧 错误案例: -- 统计学校表school中性别字段student_sex(student_sex取值为girl或者boy)的女生总人数 SUM(studen...

问题1:SUM()函数使用小技巧

错误案例:

-- 统计学校表school中性别字段student_sex(student_sex取值为girl或者boy)的女生总人数
SUM(student_sex = "girl") AS "女学生总数";  -- 这里会报错,SUM函数的参数不正确

  
 
  • 1
  • 2

解决方式:

 SUM(CASE WHEN student_sex = 'girl' THEN 1 ELSE 0 END) AS girls, -- 女生总数

  
 
  • 1

问题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; -- 按照年级分组 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如果使用这种方式去查询,会出现如下报错问题:

Semantic analysis exception - column stu.boys cannot be resolved

  
 
  • 1

错误原因是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;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这样就可以正常查询啦!

文章来源: csp1999.blog.csdn.net,作者:兴趣使然的草帽路飞,版权归原作者所有,如需转载,请联系作者。

原文链接:csp1999.blog.csdn.net/article/details/121695122

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。