Oracle合併多行為多列

2021-08-22 17:23:48 字數 1944 閱讀 2433

oracle 如何聚合多行函式

在bea論壇上看一位"專家"寫的大作,一條sql語句是

select	r.xm, 

substr(r.csrq,1,4)||'年'||substr(r.csrq,5,2)||'月'||substr(r.csrq,7,2)||'日' csrq,

(select dictvalue from zh_dictvalue where dictcode=xb and dictname='rk_xb') xb,

(select dictvalue from zh_dictvalue where dictcode=mz and dictname='rk_mz') mz,

(select dictvalue from zh_dictvalue where dictcode=ssxq and dictname='rk_xzqh') ssxq,

xz,xp,

xz,fwcs

from czrk_jbxx r,rk_zpxx p

where r.gmsfhm=p.gmsfhm and rownum<2

朋友看了一會,然後問我 (select dictvalue from zh_dictvalue where dictcode=xb and dictname='rk_xb') xb, (select dictvalue from zh_dictvalue where dictcode=mz and dictname='rk_mz') mz, (select dictvalue from zh_dictvalue where dictcode=ssxq and dictname='rk_xzqh') ssxq, 這裡如何優化,也就是符合條件的三條記錄要合併成一條記錄.

其實之前有好多這樣的問題,但沒有乙個好的方案,都是巢狀太多,效能損失很大,把三條記錄的結果合併.如果最後的sql語句中的select超過三次,那真的還不如直接這樣查詢.

不過首先這個方法是錯誤的,因為這三次都在原表中查詢,效能損失很大,其實如果是5條,10條,20條,100條.這樣的語句寫起來就累死人了.

之前有人提供了幾個方案,但都是連成字串還不是形成多列.真正形成多列應該是用分析函式:

這樣實際上只能原表做一次查詢,然後得到的結果集在顯示的時候被提前到一行上形成多列.

select * from (

select name,

lead(name,1) over (order by name) as name1,

lead(name,2) over (order by name) as name2,

lead(name,3) over (order by name) as name3,

lead(name,4) over (order by name) as name4

from tb_customer where 條件

) twhere t.name4 is not null

這樣原來的行數越多節省的效能越高,因為實際原表查詢只有一次,後來只是對記憶體中的結果做合併.上面的那個例子就是

select * from (	

select dictvalue as mz,

lead(dictvalue,1) over (order by dictcode) as ssxq,

lead(dictvalue,2) over (order by dictcode) as xb,

from zh_dictvalue

where (dictcode=xb and dictname='rk_xb')

or (dictcode=mz and dictname='rk_mz')

or (dictcode=ssxq and dictname='rk_xzqh')

) twhere t.ssxq not null

注意在order by dictcode後,苛as後面的名稱被調整了.否則dictvalue和命名的列就不對應了.

Oracle合併多行為多列

oracle 如何聚合多行函式 在bea論壇上看一位 專家 寫的大作,一條sql語句是 select r.xm,substr r.csrq,1,4 年 substr r.csrq,5,2 月 substr r.csrq,7,2 日 csrq,select dictvalue from zh dict...

GridView合併多行多列

1 2 和並列3 4 要合併的gridview 5 開始列的索引 6 結束列的索引 7 是否合併表頭,預設不合併 8 public static void mergecolumn gridview gv,int startcol,int endcol,bool containheader false...

orcale 多行多列合併為多行一列

使用concat ch1,ch2 函式,但是這個只適用於有兩個引數的。而我的是多張表,不能使用。select concat ch1,ch2 from t sql語句 這樣的效果還是不能達到我們想要的效果,然後我們使用as 將標紅的字段別名更改為我們需要的。select buc.company nam...