日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

ORACLE纯SQL实现多行合并一行

發(fā)布時間:2025/3/21 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ORACLE纯SQL实现多行合并一行 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
ORACLE純SQL實現(xiàn)多行合并一行

項目中遇到一個需求,需要將多行合并為一行。
表結(jié)構(gòu)如下:
NAME??????????????????????????? Null?????????? Type
------------------------? ?---------?? -----
N_SEC_CODE???????????????? NOT NULL? CHAR(6)
C_RESEARCHER_CODE???NOT NULL? VARCHAR2(20)

此表保存了“股票”與“研究員”的對應(yīng)關(guān)系數(shù)據(jù),一般而言,對于同一只股票而言,可能有多個研究員
對其進行跟蹤研究。所以目前遇到一個要求,需查詢出每只股票和對應(yīng)的研究員(研究員代碼間,使用逗號分隔)。
例如有如下數(shù)據(jù):
000297?????????????????????????????????? ?chenpeng????????????
000297?????????????????????????????????? ?liusu???????????????
合并處理后需顯示為:
000297?????????????????????????????????? ?chenpeng,liusu

網(wǎng)上查了很多方法,但通常而言都是編寫自定義多行文本合并函數(shù),或者對支持的列數(shù)具有局限性。
最后在英文google中搜到如下比較巧的方法。不用在數(shù)據(jù)庫中增加function,純SQL一次性搞定,
而且擴充性很好,沒有列的限制。


SELECT???n_sec_code,?TRANSLATE?(LTRIM?(text,?'/'),?'*/',?'*,')?researcherList
????FROM?(SELECT?ROW_NUMBER?()?OVER?(PARTITION?BY?n_sec_code?ORDER?BY?n_sec_code,
??????????????????lvl?DESC)?rn,
?????????????????n_sec_code,?text
????????????FROM?(SELECT?????n_sec_code,?LEVEL?lvl,
?????????????????????????????SYS_CONNECT_BY_PATH?(c_researcher_code,'/')?text
????????????????????????FROM?(SELECT???n_sec_code,?c_researcher_code?as?c_researcher_code,
???????????????????????????????????????ROW_NUMBER?()?OVER?(PARTITION?BY?n_sec_code?ORDER?BY?n_sec_code,c_researcher_code)?x
??????????????????????????????????FROM?m_researcher_stock_rel
??????????????????????????????ORDER?BY?n_sec_code,?c_researcher_code)?a
??????????????????CONNECT?BY?n_sec_code?=?PRIOR?n_sec_code?AND?x?-?1?=?PRIOR?x))
???WHERE?rn?=?1
ORDER?BY?n_sec_code;


預(yù)想的結(jié)果成功出現(xiàn),多行數(shù)據(jù)成功匯總到一行,特此分享與大家。對于你自己的應(yīng)用中,只需要把SQL中“n_sec_code”
換為你的用來匯總的列,“c_researcher_code”替換為需合并文本的列,“m_researcher_stock_rel”替換為你的表名,就是這么簡單。

SQL分析:
1、利用 “ROW_NUMBER () OVER (PARTITION BY……” 為按“股票代碼”匯總后的數(shù)據(jù)行添加組內(nèi)序號
2、“SYS_CONNECT_BY_PATH”? 按組內(nèi)序號相鄰關(guān)系,為每一層進行不同行的“研究員代碼”疊加
3、再次利用“股票代碼”進行組內(nèi)分組,但按第二部中的層次排倒序,增加調(diào)整后等級
4、取所有調(diào)整后等級為1的結(jié)果,即為所要求的數(shù)據(jù)行

方法很巧妙,值得學(xué)習(xí)。:-)

感謝網(wǎng)友@OctoberOne、@ericqliu的指點,在ORACLE10中可使用以下方法:
SELECT n_sec_code, wmsys.wm_concat (c_researcher_code) as result
FROM m_researcher_stock_rel
GROUP BY n_sec_code

posted on 2017-02-07 10:53 smile_elims 閱讀(...) 評論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/liangbo-/p/6373113.html

總結(jié)

以上是生活随笔為你收集整理的ORACLE纯SQL实现多行合并一行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。