数据库中的数据一般分行存储,但是在取出的时候,可能要求变换格式显示,比如行转列、列转行、单元格合并等操作。本示例为说明行转列。
原数据格式如下(student表):
ID | 姓名(name) | 科目(subject) | 分数(sub_score) |
1 | 小红 | 数学 | 90 |
2 | 小红 | 语文 | 91 |
3 | 小红 | 英语 | 92 |
4 | 小明 | 数学 | 80 |
5 | 小明 | 语文 | 81 |
6 | 小明 | 英语 | 82 |
7 | 小华 | 数学 | 70 |
8 | 小华 | 语文 | 71 |
9 | 小华 | 英语 | 72 |
格式(一)
ID | name | subject | sub_score |
1 | 小红 | 数学,语文,英语 | 90,91,92 |
4 | 小明 | 数学,语文,英语 | 80,81,82 |
7 | 小华 | 数学,语文,英语 | 70,71,72 |
ID | name | subject | sub_score |
1 | 小红 | 数学|语文|英语 | 90|91|92 |
4 | 小明 | 数学|语文|英语 | 80|81|82 |
7 | 小华 | 数学|语文|英语 | 70|71|72 |
格式一:
group_concat默认的分隔符是“,”,代码如下:
select id, name , group_concat(subject) as subjects , group_concat(sub_score) as scores
from student
group by name desc
执行结果为:
注:当列是数字时,通过group_concat变成BLOB类型,需进行转义,修正代码如下:
select id , name , group_concat(subject) as subjects , group_concat(cast(sub_score as char)) as scores
from student
group by name desc
执行结果为:
格式二:
方法一:数字类型的字段需要进行转义
select id,name,group_concat(subject separator '|') as subjects,group_concat(cast(sub_score as char )separator '|') as scores
from student
group by name desc
方法二:
select id,name,group_concat(subject separator '|') as subjects,replace(group_concat(sub_score),',','|') as scores
from student
group by name desc
执行结果为: