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中文网其他相关文章!