Oracle之多行記錄變一行記錄,行變列,並排序(wmsys.wm_concat)
wmsys.wm_concat
定義:Oracle PL / SQL WM_CONCAT
函式用於將來自多個行的資料聚合為單個行,從而提供與特定COMMENT_BODY
關聯的資料列表。實際上,它將以逗號分隔的列表進行交叉製表。
請注意,WM_CONCAT
未文件化且不受Oracle支援,這意味著它不應在生產系統中使用。 LISTAGG
函式可以生成與WM_CONCAT
相同的輸出,並由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 {賣家還是挺熱心的,以後再來},{東西不錯}
相關文章
- sqlldr一行記錄拆分為多行SQL
- 根據特殊識別符號,將一行轉多行記錄符號
- Oracle之記錄Oracle
- Git 學習記錄之演變歷史Git
- [Hive]用concat_w實現將多行記錄合併成一行Hive
- [MySQL] 行列變化各種方法實現總結(行變列報表統計、列變行資料記錄統計等)MySql
- oracle實驗記錄(並行操作與FTS COST)Oracle並行
- Oracle Connect by 單行變多行Oracle
- 每一行程式碼都有記錄行程
- SQL實現多行合併一行 wmsys.wm_concatSQL
- Oracle多行轉一行Oracle
- 變數與常量 - Go 學習記錄變數Go
- Git的修改提交記錄和變基Git
- 使用SQLServerAudit記錄資料庫變更SQLServer資料庫
- MAKT 物料組 變更記錄表
- MySQL 變數 、rownum 、 一行拆多行..小知識點MySql變數
- 記錄錯誤並繼續執行:錯誤事件記錄子句 --轉事件
- SQL多行變一列SQL
- oracle 行變列Oracle
- PLSQL Language Referenc-PL/SQL集合和記錄-可變陣列-正確地使用可變陣列SQL陣列
- 查欄位指定資料後一行記錄
- GO語言變數作用域-坑記錄Go變數
- awk 中的欄位、記錄和變數變數
- Android Q 新特性及變更記錄Android
- Laravel-admin 突變者案例記錄Laravel
- MySQL並行複製-原始碼理解記錄MySql並行原始碼
- 記錄一個關於變數命名的事情變數
- Oracle陣列使用以及PLSQL操作記錄Oracle陣列SQL
- Oracle之可變陣列Oracle陣列
- 一次因表變數導致SQL執行效率變慢的實戰記錄SNSR變數SQL
- Oracle RAC 文件 (記錄)Oracle
- oracle 記錄0402Oracle
- PUTTY 記錄操作記錄
- JS錯誤記錄 – dom操作 – 排序JS排序
- fabric執行記錄
- Oracle 合併行/多行合併成一行Oracle
- 域名解析的記錄型別:A記錄、CNAME、MX記錄、NS記錄型別
- v$memory_resize_ops 記錄記憶體變更的檢視記憶體