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 {賣家還是挺熱心的,以後再來},{東西不錯}
相關文章
- [Hive]用concat_w實現將多行記錄合併成一行Hive
- Git 學習記錄之演變歷史Git
- MAKT 物料組 變更記錄表
- Laravel-admin 突變者案例記錄Laravel
- Android Q 新特性及變更記錄Android
- Git的修改提交記錄和變基Git
- 變數與常量 - Go 學習記錄變數Go
- awk 中的欄位、記錄和變數變數
- GO語言變數作用域-坑記錄Go變數
- MySQL並行複製-原始碼理解記錄MySql並行原始碼
- 【BUFFER】Oracle buffer cache之 latch 學習記錄Oracle
- 記錄一個關於變數命名的事情變數
- 在oracle中將一行字串拆分成多行Oracle字串
- 一次因表變數導致SQL執行效率變慢的實戰記錄SNSR變數SQL
- 關於VBxxDATA單元內表記錄的變化
- JS錯誤記錄 – dom操作 – 排序JS排序
- fabric執行記錄
- Redis 佇列學習記錄Redis佇列
- 【記錄】sqlserver列轉行查詢 並將查詢結果用逗號分隔開SQLServer
- ORA_ROWSCN與按照commit時間對記錄進行排序MIT排序
- 劫持微信聊天記錄並分析還原 —— 訪問資料庫並檢視聊天記錄(五)資料庫
- Oracle 多行分多列Oracle
- 幾千萬記錄,資料庫表結構如何平滑變更?資料庫
- 【ORACLE21C】Oracle21c產品目錄的變化Oracle
- 記錄
- MySQL原理 - InnoDB引擎 - 行記錄儲存 - Off-page 列MySql
- oracle awr快照點不記錄問題Oracle
- 使用不可變Java記錄Record來避免多執行緒併發錯誤 - foojayJava執行緒
- GORM之ErrRecordNotFound採坑記錄GoORM
- Mac 記錄之 Homebrew換源Mac
- IOS筆記之可變字串iOS筆記字串
- 執行緒池小記錄執行緒
- gitLab進行CI配置記錄Gitlab
- 記錄Ant-Vue-table中customCell改變單元格樣式Vue
- C#獲取變更過的DataTable記錄的實現方法C#
- [20241018]21c x$mutex_sleep_history記錄的變化.txtMutex
- Laravel佇列相關問題記錄Laravel佇列
- 20240505記錄《程式碼隨想錄》筆記筆記