在 SQL 中,資料通常可以用表示單一記錄的行和包含特定屬性的列來建構。然而,在某些情況下,有必要將行轉換為列,此過程稱為轉置。在本文中,我們將探索一種使用 PostgreSQL 將行轉為列的解決方案。
考慮以下場景:您有兩個表,一個包含對問題的回答,另一個包含問題的答案包含實際問題。目標是轉置數據,以便每個使用者都有一行代表他們對所有問題的回答。
responses: user_id | question_id | body ---------------------------- 1 | 1 | Yes 2 | 1 | Yes 1 | 2 | Yes 2 | 2 | No 1 | 3 | No 2 | 3 | No questions: id | body ------------------------- 1 | Do you like apples? 2 | Do you like oranges? 3 | Do you like carrots?
所需的輸出如下所示:
user_id | Do you like apples? | Do you like oranges? | Do you like carrots? --------------------------------------------------------------------------- 1 | Yes | Yes | No 2 | Yes | No | No
為了轉置數據,我們將結合使用JOIN 和MAX() 以及CASE表達式。查詢如下:
SELECT r.user_id, MAX(CASE WHEN r.question_id = 1 THEN r.body ELSE NULL END) AS "Do you like apples?", MAX(CASE WHEN r.question_id = 2 THEN r.body ELSE NULL END) AS "Do you like oranges?", MAX(CASE WHEN r.question_id = 3 THEN r.body ELSE NULL END) AS "Do you like carrots?" FROM RESPONSES r JOIN QUESTIONS q ON q.id = r.question_id GROUP BY r.user_id
1. JOIN: JOIN 操作依據公用 Question_id 欄位在 RESPONSES 與 QUESTIONS 表之間建立關係。這使我們能夠將響應與相應的問題配對。
2. MAX() with CASE: MAX() 函數用於聚合正文列,只考慮每個使用者和問題組合的最大值。 MAX() 中的 CASE 表達式充當條件語句,檢索特定問題的正文值,如果不符合條件,則檢索 NULL。
3. GROUP BY: GROUP BY 子句以 user_id 欄位分組。這可確保輸出中的每一行代表一個唯一的使用者。
提供的 SQL 查詢有效地將行轉置為列,讓您可以輕鬆提取使用者對一組問題的回應。這種技術通常稱為資料透視,通常用於資料分析和報告。透過利用 JOIN、MAX() 和 CASE 結構以及 GROUP BY,您可以在 SQL 中實現強大的資料轉換。
以上是如何使用 PostgreSQL 將 SQL 行轉置為列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!