ORACLE纯SQL实现多行合并一行
項目中遇到一個需求,需要將多行合并為一行。
表結(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ù),一般而言,對于同一只股票而言,可能有多個研究員
對其進(jìn)行跟蹤研究。所以目前遇到一個要求,需查詢出每只股票和對應(yīng)的研究員(研究員代碼間,使用逗號分隔)。
例如有如下數(shù)據(jù):
000297?????????????????????????????????? ?chenpeng????????????
000297?????????????????????????????????? ?liusu???????????????
合并處理后需顯示為:
000297?????????????????????????????????? ?chenpeng,liusu
網(wǎng)上查了很多方法,但通常而言都是編寫自定義多行文本合并函數(shù),或者對支持的列數(shù)具有局限性。
最后在英文google中搜到如下比較巧的方法。不用在數(shù)據(jù)庫中增加function,純SQL一次性搞定,
而且擴(kuò)充性很好,沒有列的限制。
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)系,為每一層進(jìn)行不同行的“研究員代碼”疊加
3、再次利用“股票代碼”進(jìn)行組內(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
轉(zhuǎn)載于:https://www.cnblogs.com/liangbo-/p/6373113.html
總結(jié)
以上是生活随笔為你收集整理的ORACLE纯SQL实现多行合并一行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lazy WriterCheckPoin
- 下一篇: 任务01——谈谈对参与工作室的预期