【问题标题】:MySQL - How to display row value as column name using concat and group_concatMySQL - 如何使用 concat 和 group_concat 将行值显示为列名
【发布时间】:2012-12-21 06:43:26
【问题描述】:

表 1:

id   | typeid | available|
0    | 1      | 12       |
0    | 2      | 44       |

表 2:

typeid   | typename   |
1        | CL          |
2        | ML          |

我有一个使用concatgroup_concat 的查询:

select id,concat(group_concat(typename,available)) as types from table1
join table2 on table2.typeid=table1.typeid

我得到的结果是:

id | types   | 
0  | CL12,ML44 |

但我想这样显示:

id   | CL   | ML    |
0    | 12   | 44    |

有没有办法将group_concat 结果拆分为列头

我想从 table2 动态获取数据。一些用户可以将数据添加到 table2。所以硬编码类型名是不可能的。

【问题讨论】:

    标签: mysql select pivot-table group-concat


    【解决方案1】:

    您应该使用表格旋转。 MySQL 中没有 PIVOT 命令,所以可以使用这个查询 -

    SELECT
      t1.id,
      MAX(IF(t2.typename = 'CL', t1.available, NULL)) AS CL,
      MAX(IF(t2.typename = 'ML', t1.available, NULL)) AS ML
    FROM table1 t1
      JOIN table2 t2
        ON t1.typeid = t2.typeid
    GROUP BY
      t1.id;
    

    MySQL pivot tables (transform rows to columns).

    如果可能有多个 available 值,请使用 GROUP_CONCAT 函数而不是 MAX。

    【讨论】:

    • 但现在有一个挑战:如果您不知道 typename 值怎么办?那有可能吗?
    【解决方案2】:

    只有在你事先知道所有类型名的情况下才能做到这一点——否则,你需要找到另一种方法。在支持从存储过程返回结果集的数据库中,可以使用存储过程来完成。但是mysql不支持。

    如果您知道所有类型名称,请按以下方式构建查询:

    SELECT
        id,
        SUM(IF(typename = 'CL', available, 0)) AS `CL`,
        SUM(IF(typename = 'ML', available, 0)) AS `ML`
    FROM table1 join table2 on table1.typeid = table2.typeid
    GROUP BY id
    

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT a.id, MAX(IF(b.typename = 'CL', a.available, 0)) CL, 
             MAX(IF(b.typename = 'ML', a.available, 0)) ML
      FROM table1 a
      INNER JOIN table2 b ON a.typeid=b.typeid
      GROUP BY a.id;
      

      如果您想对可用列中特定类型的数据求和,请使用 SUM 函数,否则使用与 ii 相同的查询。

      【讨论】:

        猜你喜欢
        • 2012-11-07
        • 2011-06-24
        • 2017-10-15
        • 2020-05-01
        • 2015-03-30
        • 2011-11-23
        • 2012-10-28
        • 2020-03-13
        相关资源
        最近更新 更多