首页 >数据库 >mysql教程 >如何使用 GROUP_CONCAT 在 MySQL 中透视数据并处理动态列标题?

如何使用 GROUP_CONCAT 在 MySQL 中透视数据并处理动态列标题?

Linda Hamilton
Linda Hamilton原创
2025-01-06 09:44:43386浏览

How to Pivot Data in MySQL Using GROUP_CONCAT and Handle Dynamic Column Headers?

MySQL PIVOT/CROSSTAB QUERY

在数据分析中,经常需要将数据从垂直格式转换为水平格式,已知作为旋转或交叉制表。在 MySQL 中,可以使用各种技术来实现这一点。

创建数据透视表

问题 1: 考虑一个包含以下列的表: app_id、transaction_id、mobile_no、node_id、customer_attribute 和 Entered_value。任务是创建一个按 app_id、transaction_id 和 mobile_no 分组的数据透视表,node_id 中的值成为列标题,相应的 Entered_value 显示在单元格中。

答案: 这个可以使用 GROUP_CONCAT 函数来实现:

SELECT
  app_id,
  transaction_id,
  mobile_no,
  GROUP_CONCAT(CASE WHEN node_id = 1 THEN entered_value ELSE NULL END) AS Q1,
  GROUP_CONCAT(CASE WHEN node_id = 2 THEN entered_value ELSE NULL END) AS Q2,
  GROUP_CONCAT(CASE WHEN node_id = 3 THEN entered_value ELSE NULL END) AS Q3,
  GROUP_CONCAT(CASE WHEN node_id = 4 THEN entered_value ELSE NULL END) AS Q4,
  GROUP_CONCAT(CASE WHEN node_id = 5 THEN entered_value ELSE NULL END) AS Q5
FROM
  trn_user_log
GROUP BY
  app_id,
  transaction_id,
  mobile_no;

使用NAME_CONST

问题 2: 您希望使用存储在 customer_attribute 中的值,而不是使用 user_input1、user_input2 等作为列标题。

答案:使用NAME_CONST函数可以实现,但是会报错由于提供的参数不正确而遇到:

SELECT
  app_id,
  transaction_id,
  mobile_no,
  NAME_CONST(customer_attribute, (CASE WHEN node_id = 1 THEN entered_value ELSE NULL END))
FROM
  trn_user_log;

函数需要第二个参数为常量值,因此需要修改:

SELECT
  app_id,
  transaction_id,
  mobile_no,
  CASE node_id
    WHEN 1 THEN NAME_CONST(customer_attribute, entered_value)
    ELSE NULL
  END AS customer_attribute
FROM
  trn_user_log;

以上是如何使用 GROUP_CONCAT 在 MySQL 中透视数据并处理动态列标题?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn