首頁 >資料庫 >mysql教程 >如何將 MySQL 列資料轉換為行:一種 SQL 查詢方法?

如何將 MySQL 列資料轉換為行:一種 SQL 查詢方法?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-19 14:06:12123瀏覽

How to Pivot MySQL Column Data into Rows: A SQL Query Approach?

將 MySQL 列資料透視為行

使用 MySQL 時,常見的任務是將資料從列格式轉換為行格式。這個過程稱為數據透視,對於以更用戶友好且易於理解的方式呈現數據特別有用。

考慮以下場景:

您有三個表:

  • 問題表(id、問題)
  • 結果表(id、user_id、 job_id)
  • 答案表(id、answer、fk_question_id、fk_result_id)

問題表包含可能問題的清單。結果表將使用者與作業結果相關聯。答案表儲存使用者對每個結果的問題的答案。

您的目標是將問題答案顯示為每個結果集的欄位。預期的結果如下:

+-----------+---------+--------+-------------+----------+----------+
| 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn