2013年1月25日

SQL 語法將群組的資料全部列出來

我們都知道 GROUP 可以用 AVG、SUM、COUNT、MIN、MAX…等,
可以做數字、日期或是字串的運算。

但是如果群組不想要運算,要合起來全部都列出來呢 ?
通常我們就用程式跑迴圈的方式來將資料連接成一個字串。
我們知道 Oracle 有一個函數叫 concat 也就是將二個字串連接在一起,
這時候也可以用在 group 囉~~

介紹一個函數 wm_concat ,但重複資料不會排除,所以再加上 distinct 就更完美了。
欄位內容會以逗號來分隔。
不想用逗號來分隔的話,就只能用 replace 的方式來取代了。

範例:顯示部門內的所有員工資料。
SELECT gen03,wm_concat(gen01) FROM gen_file
GROUP BY gen03
ORDER BY 1

要注意,wm_concat 的欄位是以 CLOB 格式來呈現的,
所以如果有建立 view 或是直接在 p_query 使用的話,記得要轉成 VARCHAR 的格式。
原因就是 p_query 所有欄位都是依照 gaq_file.gaq03 欄位來宣告的。
用 CAST 將 CLOB 改為 VARCHAR 的格式。
範例:
SELECT gen03,cast(wm_concat(gen01) as varchar(255)) FROM gen_file
GROUP BY gen03
ORDER BY 1

另一個需注意就是 wm_concat 的資料是不能排序,
所以有可能資料所列出來的順序會不一樣。必需改為先 wm_concat 合併再 GROUP來處理。
範例:
SELECT gen03,max(cast(gen01 as varchar(255))) FROM (
SELECT gen03,wm_concat(gen01) OVER (PARTITION BY gen03 ORDER BY gen03,gen01) gen01 FROM gen_file
)
GROUP BY gen03

沒有留言:

張貼留言