將 MySQL 列資料透視為行
使用 MySQL 時,常見的任務是將資料從列格式轉換為行格式。這個過程稱為數據透視,對於以更用戶友好且易於理解的方式呈現數據特別有用。
考慮以下場景:
您有三個表:
問題表包含可能問題的清單。結果表將使用者與作業結果相關聯。答案表儲存使用者對每個結果的問題的答案。
您的目標是將問題答案顯示為每個結果集的欄位。預期的結果如下:
+-----------+---------+--------+-------------+----------+----------+ | result_id | user_id | job_id | Is it this? | Or this? | Or that? | +-----------+---------+--------+-------------+----------+----------+ | 1 | 1 | 1 | Yes | No | Maybe | | 2 | 1 | 3 | Maybe | No | Maybe | | 3 | 2 | 3 | Yes | Yes | No | +-----------+---------+--------+-------------+----------+----------+
要實現此轉換,您可以使用以下MySQL 查詢:
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
此查詢結合使用INNER JOIN 語句和MAX( ) 和CASE 函數來聚合每個問題的答案和結果組合。它有效地將資料從列格式轉換為行格式,使您可以將答案視覺化為列。
要執行此查詢,請將 FROM 和 JOIN 子句中的資料表和資料列名稱替換為您的實際資料表和資料列名稱。執行後,查詢將以所需的格式傳回透視資料。
或者,如果您有大量問題,您可以使用查詢的動態 SQL 版本來處理未知數量的問題。當透視結果中的列數未知或頻繁變化時,這種動態方法特別有用。動態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;
以上是如何將 MySQL 列資料轉換為行:一種 SQL 查詢方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!