一.背景

  • 今天在数据开发项目时,遇到一个需求,需要把多行数据以某几个字段为键,将同列或多列的多行数据拼成一行数据。

二. MySQL中聚合函数 GROUP_CONCAT()的使用

  1. 概述:MySQL中,聚合函数GROUP_CONCAT()用指定分隔符连接字符串。
  2. 通常使用
    1. 多行变一列:【语法:group_concat(列名或与其他字符拼接 Separator ‘分隔符’)】
    2. 扩展一下:多行变多列(不使用该聚合函数)

2.1 多行变一列

  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 研究生 特长 瑜伽
  1. 执行sql
select familyname, codename, biz, group_concat(key,'=',value Separator ',') as key_value from tableA 
group by familyname,codename,biz
  1. 执行结果
id familyname codename biz key-value
1 zijikanwa 001 大学 爱好=打球,职务=社长,特长=架子鼓
2 yuanyuan 007 大学 爱好=睡觉,职务=组员,特长=看剧
3 xixi 110 研究生 爱好=看小说,职务=团委,特长=瑜伽

2.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 研究生 特长 瑜伽
  1. 执行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
  1. 执行结果
id familyname codename biz 爱好 职务 特长
1 zijikanwa 001 大学 打球 社长 架子鼓
2 yuanyuan 007 大学 睡觉 组员 看剧
3 xixi 110 研究生 看小说 团委 瑜伽

三. Oracle中聚合函数 WM_CONCAT()的使用

1. 函数概述

  1. 命令格式
string wm_concat(string <separator>, string <colname>)
  1. 参数说明
    • separator:必填。STRING类型常量,分隔符。
    • colname:必填。STRING类型。如果输入为BIGINT、DOUBLE或DATETIME类型,会隐式转换为STRING类型后参与运算。

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 研究生 特长 瑜伽
  1. 执行sql
select familyname, codename, biz, wm_concat(',', key || '=' || value) as key_value from tableA 
group by familyname,codename,biz
  1. 执行结果
id familyname codename biz key-value
1 zijikanwa 001 大学 爱好=打球,职务=社长,特长=架子鼓
2 yuanyuan 007 大学 爱好=睡觉,职务=组员,特长=看剧
3 xixi 110 研究生 爱好=看小说,职务=团委,特长=瑜伽

参考资料

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐