對於老手來說,行轉列已不稀奇。但對於新手來說,對行轉列的思維方式還很模糊。
今天我要總結一下我所掌握的行轉列的思維方式,以幫助有需要的朋友更清楚的理解行轉列的方法。
行轉列的理解方式:
行轉列前,所有列的篩選條件都一樣,只是被分組了。
行轉列後,每一列各有自己的篩選條件,篩選條件就是行轉列前所分組的值。
示例:
源數據:
SELECT user_name,dept_no FROM trm_user
要求統計每個部門下的人數:
SELECT
dept_no,count(1) AS 'count'
FROM trm_user
GROUP BY dept_no
行轉列要求部門在第一行,第二行顯示人數:
SELECT 'ATD','MACAU','AIAPT'
UNION all
select
convert(VARCHAR,count(CASE WHEN dept_no='ATD' THEN 1 END)),
convert(VARCHAR,count(CASE WHEN dept_no='MACAU' THEN 1 END)),
convert(VARCHAR,count(CASE WHEN dept_no='AIAPT' THEN 1 END))
FROM trm_user
對比:
總結:
行轉列即是把行轉列前的分行條件,分別作為行轉列後的各列的篩選條件。
擴展:
易理解的寫法:
SELECT 'ATD','MACAU','AIAPT'
UNION all
SELECT
convert(VARCHAR,(SELECT count(1) FROM trm_user WHERE dept_no='ATD')),
convert(VARCHAR,(SELECT count(1) FROM trm_user WHERE dept_no='MACAU')),
convert(VARCHAR,(SELECT count(1) FROM trm_user WHERE dept_no='AIAPT'))