一.背景
- 今天在数据开发项目时,遇到一个需求,需要把多行数据以某几个字段为键,将同列或多列的多行数据拼成一行数据。
二. MySQL中聚合函数 GROUP_CONCAT()的使用
- 概述:MySQL中,聚合函数
GROUP_CONCAT()
用指定分隔符连接字符串。 - 通常使用
- 多行变一列:【语法:group_concat(列名或与其他字符拼接 Separator ‘分隔符’)】
- 扩展一下:多行变多列(不使用该聚合函数)
2.1 多行变一列
- 原数据结构
id | familyname | codename | biz | key | value |
---|
1 | zijikanwa | 001 | 大学 | 爱好 | 打球 |
2 | zijikanwa | 001 | 大学 | 职务 | 社长 |
3 | zijikanwa | 001 | 大学 | 特长 | 架子鼓 |
4 | yuanyuan | 007 | 大学 | 爱好 | 睡觉 |
5 | yuanyuan | 007 | 大学 | 职务 | 组员 |
6 | yuanyuan | 007 | 大学 | 特长 | 看剧 |
7 | xixi | 110 | 研究生 | 爱好 | 看小说 |
8 | xixi | 110 | 研究生 | 职务 | 团委 |
9 | xixi | 110 | 研究生 | 特长 | 瑜伽 |
- 执行sql
select familyname, codename, biz, group_concat(key,'=',value Separator ',') as key_value from tableA
group by familyname,codename,biz
- 执行结果
id | familyname | codename | biz | key-value |
---|
1 | zijikanwa | 001 | 大学 | 爱好=打球,职务=社长,特长=架子鼓 |
2 | yuanyuan | 007 | 大学 | 爱好=睡觉,职务=组员,特长=看剧 |
3 | xixi | 110 | 研究生 | 爱好=看小说,职务=团委,特长=瑜伽 |
2.2 扩展:多行变多列
- 原数据结构
id | familyname | codename | biz | key | value |
---|
1 | zijikanwa | 001 | 大学 | 爱好 | 打球 |
2 | zijikanwa | 001 | 大学 | 职务 | 社长 |
3 | zijikanwa | 001 | 大学 | 特长 | 架子鼓 |
4 | yuanyuan | 007 | 大学 | 爱好 | 睡觉 |
5 | yuanyuan | 007 | 大学 | 职务 | 组员 |
6 | yuanyuan | 007 | 大学 | 特长 | 看剧 |
7 | xixi | 110 | 研究生 | 爱好 | 看小说 |
8 | xixi | 110 | 研究生 | 职务 | 团委 |
9 | xixi | 110 | 研究生 | 特长 | 瑜伽 |
- 执行sql
select familyname, codename, biz,
max(CASE key WHEN '爱好' THEN value ELSE '' END) as '爱好',
max(CASE key WHEN '职务' THEN value ELSE '' END) as '职务',
max(CASE key WHEN '特长' THEN value ELSE '' END) as '特长'
from tableA
group by familyname,codename,biz
- 执行结果
id | familyname | codename | biz | 爱好 | 职务 | 特长 |
---|
1 | zijikanwa | 001 | 大学 | 打球 | 社长 | 架子鼓 |
2 | yuanyuan | 007 | 大学 | 睡觉 | 组员 | 看剧 |
3 | xixi | 110 | 研究生 | 看小说 | 团委 | 瑜伽 |
三. Oracle中聚合函数 WM_CONCAT()的使用
1. 函数概述
- 命令格式
string wm_concat(string <separator>, string <colname>)
- 参数说明
- separator:必填。STRING类型常量,分隔符。
- colname:必填。STRING类型。如果输入为BIGINT、DOUBLE或DATETIME类型,会隐式转换为STRING类型后参与运算。
2. 使用示例
- 原数据结构
id | familyname | codename | biz | key | value |
---|
1 | zijikanwa | 001 | 大学 | 爱好 | 打球 |
2 | zijikanwa | 001 | 大学 | 职务 | 社长 |
3 | zijikanwa | 001 | 大学 | 特长 | 架子鼓 |
4 | yuanyuan | 007 | 大学 | 爱好 | 睡觉 |
5 | yuanyuan | 007 | 大学 | 职务 | 组员 |
6 | yuanyuan | 007 | 大学 | 特长 | 看剧 |
7 | xixi | 110 | 研究生 | 爱好 | 看小说 |
8 | xixi | 110 | 研究生 | 职务 | 团委 |
9 | xixi | 110 | 研究生 | 特长 | 瑜伽 |
- 执行sql
select familyname, codename, biz, wm_concat(',', key || '=' || value) as key_value from tableA
group by familyname,codename,biz
- 执行结果
id | familyname | codename | biz | key-value |
---|
1 | zijikanwa | 001 | 大学 | 爱好=打球,职务=社长,特长=架子鼓 |
2 | yuanyuan | 007 | 大学 | 爱好=睡觉,职务=组员,特长=看剧 |
3 | xixi | 110 | 研究生 | 爱好=看小说,职务=团委,特长=瑜伽 |
参考资料