ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SQL 行转列(经典面试题)

SQL 行转列(经典面试题) 已知条件1. 学生表字段为 学号和姓名2. 课程表字段为科目ID和科目名称3. 成绩表 字段为学生学号科目ID成绩现要得到如下查询结果解答1. 先对score 表进行行转列将科目名称作为列名成绩作为数据进行展示。select sid, max(case when cid 1 then score else 0 end ) as 语文, max(case when cid 2 then score else 0 end ) as 数学, max(case when cid 3 then score else 0 end ) as 英语 from score group by sid得到的结果如下其中 max 函数配合case when使用例如当cid1时取score其他科目成绩设为0再取最大值就得到了语文成绩的值最后将列命名为 语文以此类推。group by sid 是要以学生学号进行分组否则只能查出一条数据。2. 得到上一步的结果后其实很容易就想到再连接学生表查询即可select stu.sid, stu.sname, max(case when cid 1 then score else 0 end ) as 语文, max(case when cid 2 then score else 0 end ) as 数学, max(case when cid 3 then score else 0 end ) as 英语 from score sco left join student stu on stu.sid sco.sid group by sid最终得到要求的结果补充查询出 语文成绩高于数学成绩的记录select stu.sid, stu.sname, max(case when cid 1 then score else 0 end ) as 语文, max(case when cid 2 then score else 0 end ) as 数学, max(case when cid 3 then score else 0 end ) as 英语 from score sco left join student stu on stu.sid sco.sid group by sid having 语文 数学此处使用 having 对分组后的数据进行过滤。得到如下结果
返回列表