1. 程式人生 > >Oracle 技巧總結(一):行轉列 及 列裝行

Oracle 技巧總結(一):行轉列 及 列裝行

1.行轉列

oracle中行轉列 語法結構select listagg(column1, ',') within group(order by column2) from X;  如下圖所示:

listagg(attr1, attr2):第一個引數是要行轉列的那個欄位,第2個引數分隔符。

within group(order by attr3):是指按照哪個欄位分組再排序,排序是指listagg的attr1最後的展示順序。其效果和select * from X group by column1 order by column1類似,但不同的是後者是查處多行(key相同,其他欄位不同的)資料,而前者是進一步加工處理了一下只展示一條資料(key相同的只有一條,只是把不同的那一列由多行變成一行,並用分隔符分開,同時遵循一定順序)。

好處:oracle提供了這個語法大大方便了PLSQL對此需求的開發,如果沒有這個語法恐怕就要進行用for迴圈遍歷再進行字串拼接了。

2. 行轉列 

關鍵字:pivot (聚合函式 for in(列1, 列2, 列3, 列4))

 select * from X pivot (sum(列) for 列2 in(範圍));

SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]--這裡是PIVOT第三步(選擇行轉列後的結果集的列)這裡可以用“*”表示選擇所有列,也可以只選擇某些列(也就是某些天)
FROM WEEK_INCOME --這裡是PIVOT第二步驟(準備原始的查詢結果,因為PIVOT是對一個原始的查詢結果集進行轉換操作,所以先查詢一個結果集出來)這裡可以是一個select子查詢,但為子查詢時候要指定別名,否則語法錯誤
PIVOT
(
    SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])--這裡是PIVOT第一步驟,也是核心的地方,進行行轉列操作。聚合函式SUM表示你需要怎樣處理轉換後的列的值,是總和(sum),還是平均(avg)還是min,max等等。例如如果week_income表中有兩條資料並且其week都是“星期一”,其中一條的income是1000,另一條income是500,那麼在這裡使用sum,行轉列後“星期一”這個列的值當然是1500了。後面的for [week] in([星期一],[星期二])中 for [week]就是說將week列的值分別轉換成一個個列,也就是“以值變列”。但是需要轉換成列的值有可能有很多,我們只想取其中幾個值轉換成列,那麼怎樣取呢?就是在in裡面了,比如我此刻只想看工作日的收入,在in裡面就只寫“星期一”至“星期五”(注意,in裡面是原來week列的值,"以值變列")。總的來說,SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])這句的意思如果直譯出來,就是說:將列[week]值為"星期一","星期二","星期三","星期四","星期五","星期六","星期日"分別轉換成列,這些列的值取income的總和。
)TBL--別名一定要寫;