MySQL 列轉行用法實現

需求

需要將如下所示原始表數據轉爲結構化的數據按行顯示:
在這裏插入圖片描述
轉爲結構化數據:
在這裏插入圖片描述

解決方法

如果是單條記錄通過SUBSTRING_INDEX容易實現,SQL語句如下:

select name,SUBSTRING_INDEX(accounts,',',1) account from personAccounts where id=1
UNION
select name,SUBSTRING_INDEX(SUBSTRING_INDEX(accounts,',',2),',',-1) account from personAccounts where id=1
UNION
select name,SUBSTRING_INDEX(SUBSTRING_INDEX(accounts,',',3),',',-1) account from personAccounts where id=1

查詢結果如下:
在這裏插入圖片描述
對於數據很多的話需要藉助中間表來實現:

CREATE TABLE digits (digit INT(1));
INSERT INTO digits
VALUES
    (0),
    (1),
    (2),
    (3),
    (4),
    (5),
    (6),
    (7),
    (8),
    (9);
-- 創建序列表
CREATE TABLE sequence (seq INT(3));
INSERT INTO sequence (
    SELECT
        D1.digit + D2.digit * 10
    FROM
        digits D1
    CROSS JOIN digits D2
);

查詢列轉爲行的語句如下:

SELECT 
	NAME,
    SUBSTRING_INDEX(SUBSTRING_INDEX(accounts, ',', seq), ',' ,- 1 ) accounts,
    seq
FROM
    sequence
CROSS JOIN personAccounts
WHERE
    seq BETWEEN 1 AND (
    	SELECT 1 + LENGTH(accounts) - LENGTH(REPLACE(accounts, ',', ''))
    )
ORDER BY name, accounts;

結果如下:
在這裏插入圖片描述


參考:
Mysql group_concat的反向應用實現(Mysql列轉行)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章