這里行轉列的基本思想就是使用max,因為其他列下面都是NULL,所以可以Max最后就只能得到有值的這行
普通的查詢:
SELECT icd , case when (ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) =1 then SLIDE_QTY END as SLIDE_QTY1, case when (ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) =1 then SLIDE_S_UNIT_PRICE END as SLIDE_S_UNIT_PRICE1, case when (ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) =2 then SLIDE_QTY END as SLIDE_QTY2, case when (ROW_NUMBER() OVER(PARTITION BY INNER_CD ORDER BY SLIDE_SEQ )) =3 then SLIDE_QTY END as SLIDE_QTY3 FROM "temp"."user" mm WHERE mm.icd = 'ADDM01-20160612-1-100002-001'
得到的數據是:
使用max后:
SELECT MAX( case when SLIDE_SEQ = 1 THEN SLIDE_QTY END )as SLIDE_QTY1, MAX( case when SLIDE_SEQ = 2 THEN SLIDE_QTY END )as SLIDE_QTY2, MAX( case when SLIDE_SEQ = 3 THEN SLIDE_QTY END )as SLIDE_QTY3, MAX( case when SLIDE_SEQ = 4 THEN SLIDE_QTY END )as SLIDE_QTY4, MAX( case when SLIDE_SEQ = 5 THEN SLIDE_QTY END )as SLIDE_QTY5, MAX( case when SLIDE_SEQ = 6 THEN SLIDE_QTY END )as SLIDE_QTY6, MAX( case when SLIDE_SEQ = 7 THEN SLIDE_QTY END )as SLIDE_QTY7, MAX( case when SLIDE_SEQ = 8 THEN SLIDE_QTY END )as SLIDE_QTY8, MAX( case when SLIDE_SEQ = 9 THEN SLIDE_QTY END )as SLIDE_QTY9, MAX( case when SLIDE_SEQ = 10 THEN SLIDE_QTY END )as SLIDE_QTY10 FROM user WHERE anken_id = 'ADDM01-20160612-1-100002-001'
得到的結果:
然后可以通過子查詢進行組合
SELECT * from m_product INNER JOIN ( SELECT anken_id, icd, MAX( case when SLIDE_SEQ = 1 THEN SLIDE_QTY END )as SLIDE_QTY1, MAX( case when SLIDE_SEQ = 2 THEN SLIDE_QTY END )as SLIDE_QTY2, MAX( case when SLIDE_SEQ = 3 THEN SLIDE_QTY END )as SLIDE_QTY3, MAX( case when SLIDE_SEQ = 4 THEN SLIDE_QTY END )as SLIDE_QTY4, MAX( case when SLIDE_SEQ = 5 THEN SLIDE_QTY END )as SLIDE_QTY5, MAX( case when SLIDE_SEQ = 6 THEN SLIDE_QTY END )as SLIDE_QTY6, MAX( case when SLIDE_SEQ = 7 THEN SLIDE_QTY END )as SLIDE_QTY7, MAX( case when SLIDE_SEQ = 8 THEN SLIDE_QTY END )as SLIDE_QTY8, MAX( case when SLIDE_SEQ = 9 THEN SLIDE_QTY END )as SLIDE_QTY9, MAX( case when SLIDE_SEQ = 10 THEN SLIDE_QTY END )as SLIDE_QTY10 FROM user WHERE user.anken_id = 'ADDM01-20160612-1-100002-001' GROUP BY user.inner_cd,user.anken_id) t1 on m_product.anken_id = t1.anken_id where t1.anken_id = 'ADDM01-20160612-1-100002-001'
就可以得到富含行轉列數據的。
列轉行的基本思路就是通過制定一個共同的字段,然后將查詢來的數據一行一行的累加起來。
SELECT aa, bb, c_1 AS cCount FROM TEMP .AAAA WHERE TEMP .AAAA.Id = 'ADDM01201606120001' UNION ALL SELECT aa, bb, c_2 AS cCount FROM TEMP .AAAA WHERE TEMP .AAAA.Id = 'ADDM01201606120001' UNION ALL SELECT aa, bb, c_3 AS cCount FROM TEMP .AAAA WHERE TEMP .AAAA.Id = 'ADDM01201606120001'