oracle 多行轉一列

2021-06-22 15:17:04 字數 3535 閱讀 6701

以前用過又忘了。。今天做資料匯出用到,記下。

oracle中的wmsys.wm_concat主要實現行轉列功能(說白了就是將查詢的某一列值使用逗號進行隔開拼接,成為一條資料)。 

select d.id,

d.papid as 援助系統,

i.papname,

d.fid as 發貨單號,

d.fwdate as 發貨時間,

w.id,

w.wid as 發貨傳票號,

w.pwunit as 慈善會,

m.manyccfname,

w.standard as 規格,

s.standardname,

w.pwcname as 收貨人,

w.fwcount as 發貨數量,

w.ischeck as 是否確認,

w.pwcount as 實收數量多個規格,

w.losecount as 損失數量,

w.pwdate as 收貨時間,

to_char(wmsys.wm_concat(n.drugnum)) as 規格id,

to_char(wmsys.wm_concat(r.drugid)),

to_char(wmsys.wm_concat(r.shelflife)),

to_char(wmsys.wm_concat(n.drugcount)) as 規格對應藥品數量

from tb_dispatchlist d

left join tb_waybill w

on d.id = w.dlid

left join tb_waybillbydrugnum n

on w.id = n.wid

left join tb_druginfo r

on r.id = n.drugnum

left join tb_manyccfinfo m

on w.pwunit = m.id

left join tb_papinfo i

on i.id = d.papid

left join tb_pap_standard s

on s.id = w.standard

where d.dstatus = '0'

and w.statu = '0'

group by d.id,

d.papid,

i.papname,

d.fid,

d.fwdate,

w.id,

w.wid,

w.pwunit,

m.manyccfname,

w.standard,

s.standardname,

w.pwcname,

w.fwcount,

w.ischeck,

w.pwcount,

w.losecount,

w.pwdate

order by d.id desc, d.fwdate desc, w.wid asc;

咳咳。。。sorry ,上面sql存在問題。

如果只是單純的把乙個字段多行轉一列,上述是沒有問題的,只需使用wm_concat函式即可。但如上面**中所示,如果有多個欄位都需多行轉一列,該方法並不能解決資料對應問題,故仍需改進。

select t.did,

t.papid,

t.papname,

t.fid,

t.fwdate,

t.id,

t.wid,

t.pwunit,

t.manyccfname,

t.standard,

t.pwcname,

t.fwcount,

t.ischeck,

t.pwcount,

t.losecount,

t.pwdate,

t.remark,

max(t.drugidstr),

max(t.shelflifestr),

max(t.drugcountstr)

from (select d.id did,

w.papid,

i.papname,

d.fid,

d.fwdate,

w.id,

w.wid,

w.pwunit,

m.manyccfname,

w.standard,

s.standardname,

w.pwcname,

w.fwcount,

w.ischeck,

w.pwcount,

w.losecount,

w.pwdate,

w.remark,

wmsys.wm_concat(r.drugid) over(partition by w.id order by r.id) drugidstr,

wmsys.wm_concat(r.shelflife) over(order by r.id) shelflifestr,

wmsys.wm_concat(n.drugcount) over(order by r.id) drugcountstr

from tb_dispatchlist d

left join tb_waybill w

on d.id = w.dlid

left join tb_waybillbydrugnum n

on w.id = n.wid

left join tb_druginfo r

on r.id = n.drugnum

left join tb_manyccfinfo m

on w.pwunit = m.id

left join tb_papinfo i

on i.id = w.papid

left join tb_pap_standard s

on s.id = w.standard

where d.dstatus = '0'

and w.statu = '0'

and n.status = '0'

) tgroup by t.did,

t.papid,

t.papname,

t.fid,

t.fwdate,

t.id,

t.wid,

t.pwunit,

t.manyccfname,

t.standard,

t.standardname,

t.pwcname,

t.fwcount,

t.ischeck,

t.pwcount,

t.losecount,

t.pwdate,

t.remark

order by t.did desc, t.fwdate desc, t.wid asc

若不加 partition by 會報 "ora-01467 sort key too long" 錯誤

若有更加優化的sql,請指正。

oracle中多行轉一列

最近專案中匯出資料一直用到將多行資料合併成一列顯示,以前不太會用,最近看到網上有一些方法,總結一下以後備用 有乙個表,表名為tab test,如下 一 多行轉一列 select id,vnum,to char wmsys.wm concat vname c from tab test group b...

SQL 多行轉一列

1 建立表 create table dbo a id nchar 10 collate chinese prc ci as null,name nchar 10 collate chinese prc ci as null,value nchar 10 collate chinese prc ci...

一列資料轉多行多列

一列資料轉多行多列 方法二 插入行列公式 公式解析 row 的功能是返回引用的行號 column 的功能是返回引用的列號 indirect函式 功能 返回文字字串所指定的引用 語法規則 indirect ref text,a1 ref text 單元格引用,該引用所指向的單元格中存放有對另一單元格的...