偶遇Oracle行轉列
阿新 • • 發佈:2019-01-09
行轉列應該是資料庫比較常見的操作了,在oracle中可以使用pivot、decode,可以參考呆瓜的blog:
SELECT name, MAX(DECODE(course, 'java', gread)) AS java, MAX(DECODE(course, 'c#', gread)) AS c#, MAX(DECODE(course, 'c', gread)) AS c, MAX(DECODE(course, 'sql', gread)) AS sql FROM t GROUP BY name; NAME JAVA C# C SQL ---------- ---------- ---------- ---------- ---------- dai 60 70 80 90 tu 90 80 70 60
實際寫報表時遇到一個變異的行轉列要求:
資料列pocket_ID,Serial_Number大約查到50多行記錄:
要求按照pocket_ID的順序將serial_Number 按照每行8個數據的格式寫出來,即
與呆瓜中提到的例子相比,因為沒有一個合適的group欄位,所以在將階梯錶轉為報表時稍微費了點心思,添加了一個輔助欄位實現了所需功能:
查詢結果:select max(A) as A,max(B) as B,max(C) as C,max(D) as D,max(E) As E,max(F) As F,max(G) as G,Max(H) as H from (SELECT trunc((P.POCKET_ID-1)/8,0) as RM, DECODE(MOD(POCKET_ID, 8), 1, SERIAL_NUMBER) AS A, DECODE(MOD(POCKET_ID, 8), 2, SERIAL_NUMBER) AS B, DECODE(MOD(POCKET_ID, 8), 3, SERIAL_NUMBER) AS C, DECODE(MOD(POCKET_ID, 8), 4, SERIAL_NUMBER) AS D, DECODE(MOD(POCKET_ID, 8), 5, SERIAL_NUMBER) AS E, DECODE(MOD(POCKET_ID, 8), 6, SERIAL_NUMBER) AS F, DECODE(MOD(POCKET_ID, 8), 7, SERIAL_NUMBER) AS G, DECODE(MOD(POCKET_ID, 8), 0, SERIAL_NUMBER) AS H FROM 資料表 WHERE 1 = 1 and 其他條件 ORDER BY POCKET_ID asc) M group by M.RM order by RM asc