0%

Mysql-行列转换

Mysql-行列转换

Mysql-行列转换

行转列

9行4列 转 3行5列

原数据:

image-20201117151521097

转换sql:

1
2
3
4
5
6
7
8
9
# 使用了group by 根据user_id分组,然后用聚合函数行转列
SELECT
user_id,
max( CASE course WHEN '数学' THEN fenzhi ELSE 0 END ) '数学',
max( CASE course WHEN '语文' THEN fenzhi ELSE 0 END ) '语文',
max( CASE course WHEN '英语' THEN fenzhi ELSE 0 END ) '英语'
FROM
u_score
group BY user_id

转换后:

image-20201117152730552

列转行

列转行 4列3行 转 3列9行

原数据:

image-20201117153039324

转行SQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#列转行 4列3行 转 3列9行
SELECT
id,
'数学' AS course,
shuxue fenzhi
FROM
score
UNION ALL
SELECT
id,
'语文' AS course,
yuwen fenzhi
FROM
score
UNION ALL
SELECT
id,
'英语' AS course,
yingyu fenzhi
FROM
score;

转换后:

image-20201117153159494

求单人平均成绩大于80:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#单个学生的平均成绩>80
SELECT
*
FROM
(
SELECT
id,
avg(fenzhi) avg
FROM
(
SELECT
id,
'数学' AS course,
shuxue fenzhi
FROM
score
UNION ALL
SELECT
id,
'语文' AS course,
yuwen fenzhi
FROM
score
UNION ALL
SELECT
id,
'英语' AS course,
yingyu fenzhi
FROM
score
) sc
GROUP BY
id
) sc2
WHERE
sc2.avg > 80

image-20201117153241128