从行到列的动态换位

时间:2018-07-10 15:25:50

标签: mysql sql

在以下情况下需要查询帮助。

表1

Name -ID1  - ID2 - ID3 - IDn  
A1  - NULL - 11 - 12  - nn  
A2  -  14  - NULL -11  -nn  

上表需要翻译如下

表2

Name - ID  
A1  - 11  
A1  - 12  
A2 - 14  
A2 - 11

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

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

1 个答案:

答案 0 :(得分:0)

可以使用多个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