Mysql和MaxCompute的多行合并一行

公司的MaxCompute(也就是ODPS)有些表,开发者会把前端的信息拆开记录,比如这个:

对应的MaxCompute记录如下:

这种方法其实无疑会增加磁盘使用量的,原本可以一行搞定,却设置成了多行。但是作为使用方我们只能被动接受,所以遇到这种情况我们就需要merge一下我们需要的内容,这样让领导可以更加清晰直观的看到报表。

MaxCompute里拼接字符串的函数是wm_concat,官方文档是: https://www.alibabacloud.com/help/zh/doc-detail/48975.htm 。直接使用它就可以把字符串通过连接符合并,但是有一个问题,就是我上图里,id_template_detail=1592的值,有对应的含义,3就是“线上配置”,如图:

这样就涉及到一个case...when的转换,最后整个语句如下,这个是一个四表联合的查询:

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
SELECT  a.gmt_create AS 变更单提交时间
,a.name_creator AS 变更发起人
,b.super_show_name AS 主管
,split_part(b.dept_name,'-',2,3) AS 域 -- 这里把部门按照-分开
,a.title_order AS 变更内容
,wm_concat(',', (CASE
WHEN d.value_content=1 THEN '修复BUG'
WHEN d.value_content=2 THEN '业务需求'
WHEN d.value_content=3 THEN '线上配置'
ELSE d.value_content
END)) AS 变更理由
,CONCAT("https://www.pornhub.com/",a.id) AS 变更链接
FROM 变更信息表 AS a
INNER JOIN 员工表 AS b
ON LPAD(a.creator, 10, 0) = LPAD(b.work_no, 10, 0) -- 工号前面的0对齐
INNER JOIN 变更关联模板表 as c
ON a.id = c.id_down_order
INNER JOIN 变更模板信息细节表 AS d
ON d.id_order = c.id
WHERE a.gmt_create > TO_CHAR( DATEADD( GETDATE() , -1, 'dd' ) ,'yyyy-MM-dd 00:00:00')
AND a.title_order like '应用【%】变更'
AND b.dept_name IN ('A-a-1部门','B-b-1部门','C-c-1部门')
AND a.dt = TO_CHAR( DATEADD( GETDATE() , - 1, 'dd' ) ,'yyyyMMdd')
AND d.dt = TO_CHAR( DATEADD( GETDATE() , - 1, 'dd' ) ,'yyyyMMdd')
AND c.dt = TO_CHAR( DATEADD( GETDATE() , - 1, 'dd' ) ,'yyyyMMdd')
GROUP BY CF单提交时间,变更发起人,工号,主管,域,变更内容,变更链接;

如果是两个值,那么可以使用if,多个值就是case...when,他俩对应的文档是 https://help.aliyun.com/document_detail/48976.html#section-jvg-uf1-mnr

在上面的基础上,如果要查询有多少个是修复BUG,多少个是业务需求,可以这样:

1
select SUM(CASE WHEN d.value_content = 1 THEN 1 ELSE 0 END) AS bug_num,SUM(CASE WHEN d.value_content = 2 THEN 1 ELSE 0 END) AS demand_num form XXX GROUP BY 去重条件;

如果是mysql,那么要把返回的多个行合并到一个行里,使用的函数是group_concat,举个例子,以id分组,把name字段的值打印在一行,分号分隔:

1
mysql> select id,group_concat(name separator ';') from aa group by id;

在上面的基础上,把去冗余的name字段的值打印在一行,这次用默认的逗号分隔:

1
mysql> select id,group_concat(distinct name) from aa group by id;

这样就达到了自由拼接select出你想要的结果的目的了。

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------