MySQL中行轉(zhuǎn)列查詢,也叫做數(shù)據(jù)逆行轉(zhuǎn)置查詢。是在一個查詢語句中將數(shù)據(jù)庫的行轉(zhuǎn)換為列的一種技巧。
在某些情況下,我們需要對一個表格中的行數(shù)據(jù)進行橫向展示,將每行數(shù)據(jù)拆解為多列、單行顯示。例如,我們需要按照每個人的身高、年齡、收入等信息排序,顯示結(jié)果如下:
姓名 身高 年齡 收入 張三 175cm 30歲 5000元 李四 180cm 28歲 6000元 王五 160cm 35歲 3000元 ...
而表中的原始數(shù)據(jù)可能是這樣的:
姓名 信息類型 信息內(nèi)容 張三 身高 175cm 張三 年齡 30歲 張三 收入 5000元 李四 身高 180cm 李四 年齡 28歲 李四 收入 6000元 王五 身高 160cm 王五 年齡 35歲 王五 收入 3000元 ...
MySQL行轉(zhuǎn)列查詢的實現(xiàn)方式常見的有使用CASE WHEN語句和使用GROUP_CONCAT()函數(shù)。
使用CASE WHEN語句實現(xiàn)行轉(zhuǎn)列查詢
使用CASE WHEN語句實現(xiàn)行轉(zhuǎn)列查詢的核心思路是根據(jù)行數(shù)據(jù)的信息類型進行分組,并在分組后的數(shù)據(jù)中分別列出需要展示的列。代碼如下:
SELECT 姓名, MAX(CASE WHEN 信息類型 = '身高' THEN 信息內(nèi)容 ELSE NULL END) AS 身高, MAX(CASE WHEN 信息類型 = '年齡' THEN 信息內(nèi)容 ELSE NULL END) AS 年齡, MAX(CASE WHEN 信息類型 = '收入' THEN 信息內(nèi)容 ELSE NULL END) AS 收入 FROM 表名 GROUP BY 姓名;
其中MAX函數(shù)的作用是用于匯總行的信息數(shù)據(jù),如果不加MAX函數(shù)會展示所有信息內(nèi)容。
使用GROUP_CONCAT()函數(shù)實現(xiàn)行轉(zhuǎn)列查詢
使用GROUP_CONCAT()函數(shù)實現(xiàn)行轉(zhuǎn)列查詢則是根據(jù)信息類型進行分組,并把所有分組后的信息內(nèi)容合并成一個字符串,通過CONCAT()函數(shù)對結(jié)果字符串進行拼接。代碼如下:
SELECT 姓名, CONCAT(GROUP_CONCAT(CASE WHEN 信息類型 = '身高' THEN 信息內(nèi)容 ELSE NULL END), ',') AS 身高, CONCAT(GROUP_CONCAT(CASE WHEN 信息類型 = '年齡' THEN 信息內(nèi)容 ELSE NULL END), ',') AS 年齡, CONCAT(GROUP_CONCAT(CASE WHEN 信息類型 = '收入' THEN 信息內(nèi)容 ELSE NULL END), ',') AS 收入 FROM 表名 GROUP BY 姓名;
GROUP_CONCAT()函數(shù)可以將分組后的信息內(nèi)容按照指定的分隔符進行合并,常用的分隔符是逗號“,”。代碼中的CONCAT()函數(shù)則是為了將合并后的字符串展示成一個單獨的列。