【问题标题】:dynamic transposition from rows to columns从行到列的动态转置
【发布时间】:2018-07-11 00:29:37
【问题描述】:

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

表1

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

上表需要如下翻译

表2

姓名 - ID
A1 - 11
A1 - 12
A2 - 14
A2 - 11

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

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

【问题讨论】:

  • 这是一次“一次性”转换吗?表 2 的设计比表 1 好得多 - 表 2 中的行顺序重要吗?
  • 你更关心哪个:更少的代码,还是更快的执行?如果是前者,您必须编写一个循环来构建动态 sql 并将 ID 值附加到查询中,然后执行查询字符串。如果是后者,你真的最好把它吸起来,然后为所有 50 列手写一次 SQL。
  • 更快的执行@Joel Coehoorn
  • 检查这个链接它有你可能需要的相关点stackoverflow.com/questions/20111418/…
  • 表结构是什么?请张贴CREATE TABLE ... 声明。

标签: mysql sql


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多