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