首页 > 数据库 > mysql教程 > 如何使用 PIVOT 在 MySQL 中执行动态交叉表查询?

如何使用 PIVOT 在 MySQL 中执行动态交叉表查询?

Susan Sarandon
发布: 2025-01-06 09:30:41
原创
652 人浏览过

How to Perform Dynamic Crosstab Queries in MySQL Using PIVOT?

MySQL PIVOT/CROSSTAB 查询

问题陈述:

需要将包含代表不同属性的用户输入的数据的表转换为交叉表格式,其中每个列标题代表一个属性,每行包含该属性对应的用户输入值。此外,customer_attribute 列的值应用作列标题,而不是静态标签。

查询 1:将数据转换为交叉表格式

要实现所需的交叉表格式,您可以使用PIVOT 查询如下:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE node_id when ',
      node_id,
      ' then entered_value else NULL END) AS user_input',
      node_id
    )
  ) INTO @sql
FROM trn_user_log;


SET @sql = CONCAT('SELECT app_id, transaction_id, mobile_no, ', @sql, ' 
                  FROM trn_user_log 
                  GROUP BY app_id, transaction_id, mobile_no');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
登录后复制

此查询使用 PIVOT 运算符将行转换为列,并按app_id、transaction_id 和 mobile_no 列。

查询 2:使用自定义列标题

要使用 customer_attribute 列中的值作为列标题,您可以稍微修改上面的查询:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE node_id when ',
      node_id,
      ' then entered_value else NULL END) AS ',
      customer_attribute
    )
  ) INTO @sql
FROM trn_user_log;

SET @sql = CONCAT('SELECT app_id, transaction_id, mobile_no, ', @sql, ' 
                  FROM trn_user_log 
                  GROUP BY app_id, transaction_id, mobile_no');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
登录后复制

此修改后的查询将静态列标题(user_input1、user_input2 等)替换为相应的列标题customer_attribute 值。

注意:

  • 这些查询中使用的准备好的语句可确保动态列创建,并避免在处理未知数量的列时出现潜在的语法错误。
  • 初始查询中使用的 NAME_CONST 函数在这种情况下不适用,因为它需要一个常量值作为第二个参数,这对于动态列不可行一代。

以上是如何使用 PIVOT 在 MySQL 中执行动态交叉表查询?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板