本文主要是介绍Mysql动态行转列处理一对多数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、业务需求
在系统中有一张事件单表以及它的扩展字段表,如下图所示:
事件单主表:
扩展字段表:
主表的一条数据对应着多条扩展表的数据,业务人员想将扩展表的field_code作为列的标题,field_value作为列的值与主表拼在一起查出来,这就是典型的列转行问题了。由于field_code不固定,所以需要动态行转列。
二、SQL实现
联表查询SQL:
SELECT
e.id,
e.title,
e.service_catalog_struct,
s.field_code,
s.field_value
FROM
event_order e
LEFT JOIN event_extension_value s ON e.id = s.event_id
WHERE
create_employee_id = 25871
查询结果:
可以看到一个单据对应了多个扩展字段值,现在需要将扩展字段变成列和它的值。
动态行转列SQL:
SET @sql = NULL;
SELECTGROUP_CONCAT(DISTINCTCONCAT('MAX(IF(s.field_code = ''',s.field_code,''', s.field_value, null)) AS ''',s.field_code, '''')) INTO @sql
FROM event_extension_value s;SET @sql = CONCAT('Select e.id,e.title,e.service_catalog_struct, ', @sql, ' From event_order e Left Join event_extension_value s On e.id = s.event_id where create_employee_id =25871Group by e.id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
查询结果:
Mysql预处理语法贴一个解析:https://www.cnblogs.com/geaozhang/p/9891338.html
这篇关于Mysql动态行转列处理一对多数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!