一、行转列
即将原本同一列下多行的不同内容作为多个字段,输出对应内容。
建表语句
1 2 3 4 5 6 7 8 9 |
|
插入数据
1 2 3 4 5 6 7 8 9 10 |
|
查询数据表中的内容(即转换前的结果)
1 |
|
先来看一下转换后的结果:
可以看出,这里行转列是将原来的subject字段的多行内容选出来,作为结果集中的不同列,并根据userid进行分组显示对应的score。
1、使用case…when…then 进行行转列
1 2 3 4 5 6 7 |
|
2、使用IF() 进行行转列:
1 2 3 4 5 6 7 |
|
注意点:
(1)SUM() 是为了能够使用GROUP BY根据userid进行分组,因为每一个userid对应的subject="语文"的记录只有一条,所以SUM() 的值就等于对应那一条记录的score的值。
假如userid =‘001’ and subject=‘语文’ 的记录有两条,则此时SUM() 的值将会是这两条记录的和,同理,使用Max()的值将会是这两条记录里面值最大的一个。但是正常情况下,一个user对应一个subject只有一个分数,因此可以使用SUM()、MAX()、MIN()、AVG()等聚合函数都可以达到行转列的效果。
(2)IF(subject
=‘语文’,score,0) 作为条件,即对所有subject='语文’的记录的score字段进行SUM()、MAX()、MIN()、AVG()操作,如果score没有值则默认为0。
3、利用SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行,并利用 IFNULL将汇总行标题显示为Total
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|