MySQL 将表列数据透视为行
要在 MySQL 中将表列数据透视为行,您可以使用 MAX( 的组合) 和 CASE 函数以及 GROUP BY 子句。以下是一般语法:
SELECT GROUP_BY_COLUMNS, MAX(CASE WHEN condition1 THEN column1 END) AS column1_alias, MAX(CASE WHEN condition2 THEN column2 END) AS column2_alias, ... FROM TABLE GROUP BY GROUP_BY_COLUMNS
在提供的示例中,您有三个表: Question,其中包含调查问卷问题;结果,将用户与工作联系起来;和答案,其中包含用户对问题的回答。
要将问题答案转为每个结果集的列,您可以使用以下查询:
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
此查询结合了答案表、问题表基于 fk_question_id 字段,结果表基于 fk_result_id 字段。然后,它按 ID、user_ID 和 job_id 列对结果进行分组,并且对于每个组,它使用 MAX() 函数和 CASE 语句计算每个问题的最大答案。
或者,如果您有未知数量的问题,您可以使用动态 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包含每个问题所需列的变量,并将其作为准备好的语句执行。
这些查询将返回问题答案作为每个结果集的列,允许您以用户友好的格式显示它们。
以上是如何将 MySQL 表列数据转换为行?的详细内容。更多信息请关注PHP中文网其他相关文章!