【问题标题】:mySQL how to unpivot dynamic columnsmySQL如何取消透视动态列
【发布时间】:2020-07-15 22:23:19
【问题描述】:

我有下表:

表名:STAT

Region   M07  M08 M09 
---------------------
P1       0    1   0    
P2       0    0   0   
P3       2    0   0    
P4       0    0   0     
P5       0    0   0     
P6       0    0   0   
P7       9    0   3  

我想 UNPIVOT 包含数值的月份列。这个 Months 列标题是动态的,并且会发生变化,但总列数将保持不变。

预期结果

---------------------
Region   Month  Qty
---------------------
P1      M07    0
P1      M08    1
P1      M09    0
P2      M07    0
P2      M08    0
P2      M09    0

如果我能得到一些帮助,将这条 SQL 语句写入 UNPIVOT,然后再考虑数值列的动态特性,那就太好了。 它应该用 mySQL 编写。

【问题讨论】:

    标签: mysql sql date union unpivot


    【解决方案1】:

    遗憾的是,mysql 没有UNPIVOT 函数。

    您最好的选择是UNION ALL 解决方案,例如:

    SELECT region, 'M07' AS month, M07 AS qty from stat
    UNION ALL
    SELECT region, 'M08', M08 AS from stat
    UNION ALL 
    SELECT region, 'M09', M09 AS from stat
    

    可以通过首先查询INFORMATION_SCHEMA 以检索列名并使用结果构建查询来创建一段 SQL 代码(例如作为存储过程),从而动态生成此 SQL 查询文本。

    【讨论】:

    • 感谢您的帮助。我有另一个问题。原始数据位于我桌面上的 .csv 文件中。我使用了您的代码,但出现错误: CREATE TABLE stat ( ID VARCHARACTER(10), M07 decimal(4,2), M08 decimal(4,2), M09 decimal(4,2), ); LOAD DATA LOCAL INFILE '/Users/blytonpereira/Desktop/Book1.csv' REPLACE INTO TABLE book FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES; SELECT region, 'M07' AS month, M07 AS qty from stat UNION ALL SELECT region, 'M08', M08 AS from stat UNION ALL SELECT region, 'M09', M09 AS from stat
    • @user23456 ...您的问题是什么?
    • 请参阅上面的评论。我尝试使用该代码,但出现错误,不知道为什么会发生。
    • @user23456,这看起来与您的原始问题无关。如果您觉得我的回答对您有帮助,请接受,如有需要,请提出其他问题
    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多