Oracle之多行記錄變一行記錄,行變列,並排序(wmsys.wm_concat)

wmsys.wm_concat

Definition: The Oracle PL/SQL WM_CONCAT function is used to aggregate data from a number of rows into a single row, giving a list of data associated with a specific COMMENT_BODY. In effect, it cross-tabulates a comma delimited list.

Note that WM_CONCAT is undocumented and unsupported by Oracle, meaning it should not be used in production systems. The LISTAGG function, which can produce the same output asWM_CONCAT is both documented and supported by Oracle.

1. 現有數據結構

BBSDETAIL表(主表)

DETAIL_ID NOT NULL NUMBER  主鍵
TITLE NOT NULL VARCHAR2(100)

BBSCOMMENT表(從表)

DETAIL_ID NOT NULL NUMBER  外鍵
COMMENT_BODY NOT NULL VARCHAR2(500)
COMMENT_TIME NOT NULL DATE

2. 實現功能一(從表多行記錄合併爲一行,不要求排序)

--多行合併爲一行,不要求排序
select DETAIL_ID,wmsys.wm_concat('{'||COMMENT_BODY||'}')
from BBSCOMMENT
group by DETAIL_ID;

輸出:
13859 {東西好,送貨快 },{好 },{物流有些慢 }
14938 {賣家還是挺熱心的,以後再來 },{東西不錯 }

3. 實現功能二(從表多行記錄合併爲一行後,與主表做一連接)

複製代碼
--將上述SQL語句與主表做一個連接查詢
select bd.DETAIL_ID,TITLE,bcm.COMMENT_INFO
from BBSDETAIL bd,(select DETAIL_ID,wmsys.wm_concat('{'||COMMENT_BODY||'}') as COMMENT_INFO from BBSCOMMENT group by DETAIL_ID) bcm
where bd.DETAIL_ID=bcm.DETAIL_ID(+);
複製代碼

輸出:
13859 蘇泊爾電壓力鍋配件 {東西好,送貨快 },{好 },{物流有些慢 }
14938 Nike/耐克男性跑步鞋跑步 {賣家還是挺熱心的,以後再來 },{東西不錯 }

4. 實現功能三(從表多行記錄合併爲一行,並按評價時間排序)

複製代碼
--多行合併爲一行,要求排序(最新的評論在前面)
select DETAIL_ID, max(r)
from (select DETAIL_ID, wmsys.wm_concat(COMMENT_BODY||'('||to_char(COMMENT_TIME,'yyyy-mm-dd hh:mi:ss')||')')
    OVER(PARTITION BY DETAIL_ID ORDER BY COMMENT_TIME desc) r from BBSCOMMENT)
group by DETAIL_ID;
複製代碼

輸出:

13859 東西好,送貨快(2013-02-19 06:27:37),好(2012-01-14 02:23:46),物流有些慢(2012-01-01 12:00:25)
14938 賣家還是挺熱心的,以後再來(2011-11-27 05:28:27),東西不錯(2011-10-11 05:09:06)

5. 實現功能四(行變列:分兩列顯示從表兩種彙總結果,排序,並保證兩列中數據的對應關係)

複製代碼
--分兩列顯示兩種彙總結果,並排序,保證對應關係
select DETAIL_ID,COMMENT_TIME,COMMENT_BODY from (
 select
 DETAIL_ID,
  WMSYS.WM_CONCAT(to_char(COMMENT_TIME,'yyyy-mm-dd hh:mi:ss'))
          OVER(PARTITION BY DETAIL_ID ORDER BY COMMENT_TIME) COMMENT_TIME,
   WMSYS.WM_CONCAT('{'||COMMENT_BODY||'}')
          OVER(PARTITION BY DETAIL_ID ORDER BY COMMENT_TIME) COMMENT_BODY,
      row_number() OVER(PARTITION BY DETAIL_ID ORDER BY COMMENT_TIME desc) rs
  from BBSCOMMENT) where rs=1;
複製代碼

輸出:

13859 2013-02-19 06:27:37,2012-01-14 02:23:46,2012-01-01 12:00:25 {東西好,送貨快},{好},{物流有些慢}
14938 2011-11-27 05:28:27,2011-10-11 05:09:06 {賣家還是挺熱心的,以後再來},{東西不錯}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章