一、业务需求
在系统中有一张事件单表以及它的扩展字段表,如下图所示:
事件单主表:
扩展字段表:
主表的一条数据对应着多条扩展表的数据,业务人员想将扩展表的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;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'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 =25871
Group by e.id');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
查询结果:
Mysql预处理语法贴一个解析:https://www.cnblogs.com/geaozhang/p/9891338.html