首页 > 数据库 > mysql教程 > 如何以问题答案为列来透视 MySQL 表数据?

如何以问题答案为列来透视 MySQL 表数据?

Susan Sarandon
发布: 2024-12-21 19:31:14
原创
466 人浏览过

How to Pivot MySQL Table Data with Question Answers as Columns?

MySQL 数据透视表列数据作为行

数据透视表是将数据从基于列的格式转换为行的强大工具 -为基础的格式。在 MySQL 中,可以使用 CASE 表达式结合聚合函数来实现此转换。

要将给定数据转换为数据透视表格式,其中问题答案显示为列,可以使用以下查询:

SELECT  a.ID,
        a.user_ID,
        a.job_id,
        MAX(CASE WHEN c.question = 'Is it this?' THEN b.answer END) 'Is it this?',
        MAX(CASE WHEN c.question = 'Or this?' THEN b.answer END) 'Or this?',
        MAX(CASE WHEN c.question = 'Or that? ' THEN b.answer END) 'Or that? '
FROM    Results a
        INNER JOIN Answers b
            ON a.id = b.fk_result_id
        INNER JOIN Question c
            ON b.fk_question_id = c.ID
GROUP   BY a.ID,
        a.user_ID,
        a.job_id
登录后复制

在此查询中,CASE 表达式用于检查 Question 表的问题列,并从 Answers 表中返回相应的答案。然后使用聚合函数 MAX 查找每个问题的最大值,该值代表为该问题提供的答案。

动态透视

对于数字问题的数量未知或较大,可以使用以下代码生成动态 SQL 语句:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN c.question = ''',
      question,
      ''' then b.answer end) AS ',
      CONCAT('`',question,'`')
    )
  ) INTO @sql
FROM Question;

SET @sql = CONCAT('SELECT  a.ID,
                            a.user_ID,
                            a.job_id, ', @sql, ' 
                    FROM    Results a
                            INNER JOIN Answers b
                                ON a.id = b.fk_result_id
                            INNER JOIN Question c
                                ON b.fk_question_id = c.ID
                    GROUP   BY a.ID,
                            a.user_ID,
                            a.job_id');

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

此代码生成动态 SQL 语句,可以处理任意数量的问题。它通过将每个问题的最大值连接为列名称来动态构造 SELECT 子句。

查询的结果将是具有所需格式的数据透视表,其中每个问题的答案显示为单独的列.

以上是如何以问题答案为列来透视 MySQL 表数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

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