首页 > 解决方案 > 从行到列的动态转置

问题描述

在查询以下场景时需要您的帮助。

表格1

名称 -ID1 - ID2 - ID3 - IDn  
A1 - 空 - 11 - 12 - nn  
A2 - 14 - 空 -11 -nn  

上表需要翻译如下

表2

姓名 - 身份证  
A1 - 11  
A1 - 12  
A2 - 14  
A2 - 11

table1 中的 id 值可以到 ID50。表 2 将是基于表 1 的输出。不会考虑所有空值。做这个的最好方式是什么。任何动态执行此操作的方式,因为 ID 值至少会像 ID1 - ID50

任何人都可以帮助我查询如何执行此操作。非常感谢

标签: mysqlsql

解决方案


可以使用多个 SQL 查询。

SET @SQL = NULL;

SET SESSION group_concat_max_len = @@max_allowed_packet;

SELECT 
 GROUP_CONCAT(
   CONCAT(
     "SELECT "
     , "Name"
     , ", " , COLUMNS.COLUMN_NAME, " AS id"
     , " FROM "
     , COLUMNS.TABLE_NAME
     , " WHERE "
     , COLUMNS.COLUMN_NAME
     , " IS NOT NULL "
   )
   SEPARATOR ' UNION ALL '
 ) AS SQL_code
 INTO
   @SQL
FROM 
 information_schema.COLUMNS
WHERE
   COLUMNS.TABLE_NAME = 'Table1'
 AND
   COLUMNS.COLUMN_NAME <> 'Name';

SET @SQL := CONCAT(@SQL, " ORDER BY Name ASC"); 

PREPARE s FROM @SQL;
EXECUTE s;

见演示https://www.db-fiddle.com/f/jdcmYDxDLnEgBQ6YGJP1PH/1


推荐阅读