[英]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_NUMBER
和GROUP 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
輸出:
╔═════════╦════════════╦══════╗
║ Admin ║ Moderator ║ User ║
╠═════════╬════════════╬══════╣
║ Tony ║ (null) ║ Sara ║
║ (null) ║ (null) ║ John ║
╚═════════╩════════════╩══════╝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.