【问题标题】:Transposing Dynamic Columns to Rows将动态列转置为行
【发布时间】:2013-05-03 12:49:37
【问题描述】:

我想知道如何将Table_1 转为Expected_Result_Table

Table1
-----------------------------------------
Id       abc  brt ccc ddq eee fff gga hxx
-----------------------------------------
12345     0    1   0   5   0   2   0   0  
21321     0    0   0   0   0   0   0   0   
33333     2    0   0   0   0   0   0   0   
41414     0    0   0   0   5   0   0   1   
55001     0    0   0   0   0   0   0   2   
60000     0    0   0   0   0   0   0   0 
77777     9    0   3   0   0   0   0   0
Expected_Result_Table
---------------------
Id      Word   Qty>0
---------------------
12345    brt    1
12345    ddq    5
12345    fff    2
33333    abc    2
41414    eee    5
41414    hxx    1
55001    hxx    2
77777    abc    9
77777    ccc    3

那么,如何转置Table_1 中的列导致Expected_Result_Table,只考虑> 0 的值?

【问题讨论】:

    标签: mysql unpivot


    【解决方案1】:

    MySQL 没有 UNPIVOT 函数,但您可以使用 UNION ALL 将列转换为行。

    基本语法是:

    select id, word, qty
    from
    (
      select id, 'abc' word, abc qty
      from yt
      where abc > 0
      union all
      select id, 'brt', brt
      from yt
      where brt > 0
    ) d
    order by id;
    

    在您的情况下,您声明您需要动态列的解决方案。如果是这种情况,那么您将需要使用准备好的语句来生成动态 SQL:

    SET @sql = NULL;
    
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'select id, ''',
          c.column_name,
          ''' as word, ',
          c.column_name,
          ' as qty 
          from yt 
          where ',
          c.column_name,
          ' > 0'
        ) SEPARATOR ' UNION ALL '
      ) INTO @sql
    FROM information_schema.columns c
    where c.table_name = 'yt'
      and c.column_name not in ('id')
    order by c.ordinal_position;
    
    SET @sql 
      = CONCAT('select id, word, qty
               from
               (', @sql, ') x  order by id');
    
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    SQL Fiddle with Demo

    【讨论】:

      【解决方案2】:

      您基本上是将数据从列转为行,您可以使用 UNION ALL。过滤器可以应用于非透视子查询,也可以单独应用于各个部分。

      select id, Word, Qty from
      (
        select id, 'abc' Word, abc Qty from table1 
        union all
        select id, 'brt', brt from table1
        union all
        select id, 'ccc', ccc from table1
        union all
        select id, 'ddq', ddq from table1
        union all
        select id, 'eee', eee from table1
        union all
        select id, 'fff', fff from table1
        union all
        select id, 'gga', gga from table1
        union all
        select id, 'hxx', hxx from table1
      ) x
      where Qty > 0
      order by id;
      

      【讨论】:

      • 谢谢,理查德。我的表有动态列和未知列。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      相关资源
      最近更新 更多