簡體   English   中英

MySQL使用VARCHAR進行數據透視

[英]MySQL pivoting with VARCHAR

假設我的表'Organization'有兩列'Name'和'Role'。 字段'Name'包含一個字符串,類似'Role'可以是以下列表中的字符串:['Admin','Moderator','User']。

我想執行一個查詢,打印我按角色排序的用戶。 例如,有以下起始表:

+++++++++++++++++++++++
+   Name   +   Role   +
+++++++++++++++++++++++
+   Sara   +   User   +
+   Tony   +   Admin  +
+   John   +   User   +
+++++++++++++++++++++++

我想獲得以下查詢:

++++++++++++++++++++++++++++++++++++++++
+   Admin   +   Moderator   +   User   +
++++++++++++++++++++++++++++++++++++++++
+   Tony    +      NULL     +   Sara   +
+   NULL    +      NULL     +   John   +
++++++++++++++++++++++++++++++++++++++++

到目前為止我提出的最佳解決方案如下,但我希望有一個更緊湊的解決方案。 我需要的是分離列然后重新加入它們,但我不知道如何做到這一點......

SELECT CASE WHEN Role = 'Admin' THEN Name END AS 'Admin', 
CASE WHEN Role = 'Moderator' THEN Name END AS 'Moderator', 
CASE WHEN Role= 'User' THEN Name END AS 'User'
FROM Organization;

++++++++++++++++++++++++++++++++++++++++
+   Admin   +   Moderator   +   User   +
++++++++++++++++++++++++++++++++++++++++
+   NULL    +      NULL     +   Sara   +
+   Tony    +      NULL     +   NULL   +
+   NULL    +      NULL     +   John   +
++++++++++++++++++++++++++++++++++++++++

為此,您可以使用等效的ROW_NUMBERGROUP BY計算的RowNumber列:

SELECT 
    MAX(CASE WHEN Role = 'Admin' THEN Name END) AS `Admin`, 
    MAX(CASE WHEN Role = 'Moderator' THEN Name END) AS `Moderator`, 
    MAX(CASE WHEN Role = 'User' THEN Name END) AS `User`
FROM (
      SELECT *
        ,@row_num := IF(@prev_value=concat_ws('',t.Role),@row_num+1,1) AS RowNumber
        ,@prev_value := concat_ws('',t.Role)  
      FROM Organization t,
         (SELECT @row_num := 1) x,
         (SELECT @prev_value := '') y
      ORDER BY t.Role   
     ) AS sub
GROUP BY RowNumber

SqlFiddleDemo

輸出:

╔═════════╦════════════╦══════╗
║ Admin   ║ Moderator  ║ User ║
╠═════════╬════════════╬══════╣
║ Tony    ║ (null)     ║ Sara ║
║ (null)  ║ (null)     ║ John ║
╚═════════╩════════════╩══════╝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM