Postgresql 第 7 题

7、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )
①、

select     
S.sid,
S.sname,
coalesce(cast(countcid AS varchar(4) ), '0' ) AS "选课总数",
coalesce(cast(sumscore AS varchar(4)), 'null' ) AS "总成绩"
FROM student AS S left join(
select sid, 
count(cid) AS countcid, 
sum(score) AS sumscore
from SC
group by sid) AS SC1
ON  S.sid=SC1.sid;
    sid     |         sname          | 选课总数 | 总成绩
------------+------------------------+----------+--------
 07         | 郑竹                   | 2        | 187
 02         | 钱电                   | 3        | 210
 06         | 吴兰                   | 2        | 65
 03         | 孙风                   | 3        | 240
 04         | 李云                   | 3        | 100
 05         | 周梅                   | 2        | 163
 01         | 赵雷                   | 3        | 189
 10         | 李四                   | 0     | null
 11         | 李四                   | 0     | null
 12         | 赵六                   | 0     | null
 13         | 孙七                   | 0     | null
 09         | 张三                   | 0     | null
(12 行记录)

②、网络答案:

SELECT S2.sid, S2.sname, COUNT(S1.Sid) AS 选课总数, 
	COALESCE(CAST(SUM(score) AS VARCHAR(4)), 'NULL') AS 总成绩 
FROM SC AS S1 RIGHT OUTER JOIN Student AS S2 
ON S1.Sid = S2.Sid 
GROUP BY S2.sid, S2.sname;

被搞蒙了……选课总数不用COALESCE 函数吗?(不用呗,因为count()结果会是0)

    sid     |         sname          | 选课总数 | 总成绩
------------+------------------------+----------+--------
 03         | 孙风                   |        3 | 240
 04         | 李云                   |        3 | 100
 06         | 吴兰                   |        2 | 65
 01         | 赵雷                   |        3 | 189
 12         | 赵六                   |        0 | NULL
 11         | 李四                   |        0 | NULL
 10         | 李四                   |        0 | NULL
 09         | 张三                   |        0 | NULL
 13         | 孙七                   |        0 | NULL
 02         | 钱电                   |        3 | 210
 07         | 郑竹                   |        2 | 187
 05         | 周梅                   |        2 | 163
(12 行记录)

两个程序,逻辑上一个是先分组再联结,一个是先联结再分组,个人感觉先分组再联结效果会高一点吧?有机会测试下或者来大神指点下

知识点:
①、CAST(转换前的值 AS 想要转换的数据类型)
例如:SELECT CAST(‘0001’ AS INTEGER) AS int_col;
②、coalesce(数据1,数据2,数据3,……)
例如:

SELECT COALESCE(NULL,0)                  AS col_1,
       COALESCE(NULL, 'test', NULL)       AS col_2,
       COALESCE(NULL, NULL, '2009-11-01') AS col_3;

 col_1 | col_2 |   col_3
-------+-------+------------
     0 | test  | 2009-11-01
(1 行记录)

③、聚合函数COUNT()、SUM()、AVG()、MAX()、MIN()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值