case when
- 语句
case when 表达式 then 输出 when 表达式 then 输出 else 输出 end
- scores表创建
name | stage | score |
---|---|---|
a | js | 1 |
b | js | 2 |
c | js | 3 |
a | py | 2 |
b | py | 3 |
c | py | 1 |
a | sql | 2 |
b | sql | 2 |
c | sql | 4 |
通过 SQL 将表的成绩进行统计!
SELECT
name,
max(
CASE
WHEN stage = 'js' THEN
score
ELSE
NULL
END
) AS js,
max(
CASE
WHEN stage = 'py' THEN
score
ELSE
NULL
END
) AS py,
max(
CASE
WHEN stage = 'sql' THEN
score
ELSE
NULL
END
) AS 'sql',
AVG(score)
AS ag
FROM
scores
GROUP BY
name
- 生成表
name | js | py | sql | ag |
---|---|---|---|---|
a | 1 | 2 | 2 | 1.6667 |
b | 2 | 3 | 2 | 2.3333 |
c | 3 | 1 | 4 | 2.6667 |
join
1. join 与 left join 的区别
1.1 left join 必须有 on;
1.2 left join 会检查左边表的数据是否都包含在新生成的表中;是,则与 join 没区别;否,则用 null 与不包含的行,组成新行,加入新表!
2. join 实现 case when 效果
SELECT
s1.`name`,
s1.score AS js,
s2.score AS py,
s3.score AS 'sql',
(s1.score + s2.score + s3.score) / 3 AS ag
FROM
scores s1
JOIN scores s2 ON s1.stage = 'js'
AND s2.stage = 'py'
AND s1.`name` = s2.`name`
JOIN scores s3 ON s3.stage = 'sql'
AND s1.`name` = s3.`name`
缺点:计算每个人的平均分数比较麻烦,如果增加科目,计算平均分需要修改!
3. 优化平均分计算
SELECT
s1.`name`,
s1.score AS 'js',
s2.score AS 'py',
s3.score AS 'sql',
s4.ag AS ag
FROM
scores s1
JOIN scores s2 ON s1.stage = 'js'
AND s2.stage = 'py'
AND s1.`name` = s2.`name`
JOIN scores s3 ON s3.stage = 'sql'
AND s1.`name` = s3.`name`
JOIN (
SELECT
`name`,
AVG(score) AS ag
FROM
scores
GROUP BY
`name`
) s4 ON s4.`name` = s1.`name`
4. 结果
name | js | py | sql | ag |
---|---|---|---|---|
a | 1 | 2 | 2 | 1.6667 |
b | 2 | 3 | 2 | 2.3333 |
c | 3 | 1 | 4 | 2.6667 |