專案中遇到乙個需求,需要將多行合併為一行。
表結構如下:
name null type
------------------------ --------- -----
n_sec_code not null char(6)
c_researcher_code not null varchar2(20)
此表儲存了「**」與「研究員」的對應關係資料,一般而言,對於同一只**而言,可能有多個研究員對其進行跟蹤研究。所以目前遇到乙個要求,需查詢出每只**和對應的研究員(研究員**間,使用逗號分隔)。
例如有如下資料:
000297 chenpeng
000297 liusu
合併處理後需顯示為:
000297 chenpeng,liusu
網上查了很多方法,但通常而言都是編寫自定義多行文字合併函式,或者對支援的列數具有侷限性。
最後在英文google中搜到如下比較巧的方法。不用在資料庫中增加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;
預想的結果成功出現,多行資料成功彙總到一行,特此分享與大家。對於你自己的應用中,只需要把sql中「n_sec_code」換為你的用來彙總的列,「c_researcher_code」替換為需合併文字的列,「m_researcher_stock_rel」替換為你的表名,就是這麼簡單。
sql分析:
1、利用 「row_number () over (partition by……」 為按「****」彙總後的資料行新增組內序號
2、「sys_connect_by_path」 按組內序號相鄰關係,為每一層進行不同行的「研究員**」疊加
3、再次利用「****」進行組內分組,但按第二部中的層次排倒序,增加調整後等級
4、取所有調整後等級為1的結果,即為所要求的資料行
遇到乙個需求,需要將資料庫的字段,行轉列
1.本來查詢出來,是六行資料,現在要把六行資料,加在一行的,六列裡面。這裡需要用到行轉列 第一步 將查詢出來的六行資料,做乙個表,然後進行關聯,在把每乙個值取出來,放進新的列裡面。union all union all union all union all union all union all ...
最近專案中遇到的乙個演算法挑戰
在企業資訊化程序中,各類智慧型化運算在不斷挑戰著我們,最近又遇到乙個應用,歸納一下需要實現以下演算法 演算法設計 計算是否存在值x1,x2,xm,使等式成立 m x1 m 1 x2 m 3 x3 xm e 如果可解,取解集中各x的值,要求x1盡可能大,其次是x2,xm盡可能最大,在各x值相等情況下存...
乙個blog小專案中遇到的問題
小專案使用了easyui,在使用中遇到了一些問題,羅列如下,後續再有的,繼續補充。1.封面圖上傳的時候,使用jquery函式,頁面載入即載入方法,需要的效果是,選擇上傳的後,頁面會顯示的縮圖,使用ajax區域性重新整理,所以需要的是onchange事件,錯寫為onclick事件,導致上傳不成功,沒有...