文章目录
前言
本篇文章将总结博主在笔试或面试过程中碰到的比较有难度或经典的sql题目。笔试考察的大都不是很难,不像工作中那样好几个嵌套子查询,很多个表关联…可能行数很少,但绝对得多想。如果之前没碰见过,第一次做肯定会漏洞百出。会持续更新的~
一、列转行
题目:将表Student
name | subject | score |
---|---|---|
张三 | 语文 | 78.0 |
张三 | 数学 | 88.0 |
张三 | 英语 | 98.0 |
李四 | 语文 | 89.0 |
李四 | 数学 | 76.0 |
李四 | 英语 | 90.0 |
王五 | 语文 | 66.0 |
转化为下面的形式展示
name | 语文 | 数学 | 英语 | 总分 |
---|---|---|---|---|
张三 | 78 | 88 | 98 | 264 |
李四 | 89 | 76 | 90 | 255 |
王五 | 99 | 0 | 0 | 66 |
先放答案
SELECT `name`,语文,数学,英语,总分
FROM(
SELECT
`name`,
SUM(IF(SUBJECT = '语文',score,0)) AS 语文,
SUM(IF(SUBJECT = '数学',score,0)) AS 数学,
SUM(IF(SUBJECT = '英语',score,0)) AS 英语
FROM student
GROUP BY `name`)t1
LEFT JOIN(
SELECT `name`,SUM(score) AS 总分
FROM student
GROUP BY `name`)t2
USING(`name`);
逐步剖析
1、先看总分,计算很简单,就是按名字group by 之后 sum(分数) 即可
SELECT `name`,SUM(score) AS 总分
FROM student
GROUP BY `name`
name | 总分 |
---|---|
张三 | 264 |
李四 | 255 |
王五 | 66 |
得出这样的结果
2、本题精髓就是怎么把 subject 这一列数据转化成一行列名。可以拿 subject 列中的数据做 if 判断的条件,创建一张只有 name列 不变,后几列是 语数英 的新表
SELECT
`name`,
IF(SUBJECT = '语文',score,0) AS 语文,
IF(SUBJECT = '数学',score,0) AS 数学,
IF(SUBJECT = '英语',score,0) AS 英语
FROM student
name | 语文 | 数学 | 英语 |
---|---|---|---|
张三 | 78.0 | 0 | 0 |
张三 | 0 | 88.0 | 0 |
张三 | 0 | 0 | 98.0 |
李四 | 89.0 | 0 | 0 |
李四 | 0 | 76.0 | 0 |
李四 | 0 | 0 | 90.0 |
王五 | 66.0 | 0 | 0 |
3、离最终答案不远了,用 group by + sum 就能变成没人一行且语数英三列数据合并
SELECT
`name`,
SUM(IF(SUBJECT = '语文',score,0)) AS 语文,
SUM(IF(SUBJECT = '数学',score,<