此函式在oracle版本12g以後廢棄,不可使用
解決方法:列轉行 --> 使用 sys_connect_by_path() 函式替代
listagg函式
自從since oracle 9i 開始,就可以通過 sys_connect_by_path 函式實現將從父節點到當前行內容以「path」或者層次元素列表的形式顯示出來
舉例:若無上下級關係時,如何使用
select max(ltrim(sys_connect_by_path(x.variety_id, ','), ',')) variety_id,
x.seq_no,
bill_no
from (select td.variety_id,
dense_rank() over(partition by t.seq_no, t.bill_no order by td.variety_id) rw,
t.seq_no,
t.bill_no
from clear.tc_home_lease_match t,
clear.tc_home_lease_detail td
where t.seq_no = td.seq_no
and t.bill_no = td.bill_no
and t.seq_no = '13') x
start with rw = 1
connect by rw = prior rw + 1
and seq_no = prior seq_no
and bill_no = prior bill_no
group by seq_no, bill_no
分析:原先無上下級關係,構造rw 和 rw+1 做上下級關係,此處將rw+1 認定是另乙個字段,比較好理解。
樹結構是從 rw 到 rw+1
資料內容
資料結果
此函式在oracle 11g版本中推出,結果和上面的比較,有一處不同,
上面的函式若同一筆seq_no+bill_no,若對應的variety_id有相同的多條記錄的話,只會展示不同的variety_id,不會將相同的variety_id一起拼。listagg會將所有的variety_id一起拼,不去考慮是否有相同值。
如果能在業務上保證無重複值,使用listagg效能會好很多
select td.seq_no,
td.bill_no,
listagg(td.variety_id, ',') within group(order by td.variety_id)
from clear.tc_home_lease_match t, clear.tc_home_lease_detail td
where t.seq_no = td.seq_no
and t.bill_no = td.bill_no
group by td.seq_no, td.bill_no
此函式是11g以後才有的,11g以前的資料庫版本不要使用
select *
from (select d.s_owner, d.clean_field, max(s_table_name) s_table_name
from (select d.s_owner,
d.clean_field,
to_char(substr(wmsys.wm_concat(d.s_table_name)
over(partition by d.s_owner,
d.clean_field order by
d.s_table_name),
1,4000)) s_table_name
from security.ts_data_clean_def d, user_tables u
where d.s_owner = 'trade'
and d.s_table_name = u.table_name) d
group by d.s_owner, d.clean_field) a,
(select s_owner,
clean_field,
max(substr(sys_connect_by_path(s_table_name, ','), 2)) s_table_name
from (select d.s_owner,
d.clean_field,
d.s_table_name,
row_number() over(partition by d.s_owner, d.clean_field order by d.s_owner, d.clean_field, d.s_table_name) rn_by_id,
dense_rank() over(order by d.s_owner, d.clean_field) + row_number() over(order by d.s_owner, d.clean_field, d.s_table_name) rn
from security.ts_data_clean_def d, user_tables u
where d.s_owner = 'trade'
and d.s_table_name = u.table_name)
start with rn_by_id = 1
connect by rn - 1 = prior rn
group by s_owner, clean_field) b
where a.s_owner = b.s_owner
and a.clean_field = b.clean_field
and a.s_table_name <> b.s_table_name
二、行轉列函式unpivot
此函式是11g以後才有的
解決方法: 行轉列 --> 使用 union all 替代
列轉行 行轉列
問題 使用case when實現行轉列 解決 1 測試準備 create table studentscores username nvarchar2 20 學生姓名 subject nvarchar2 30 科目 score float 成績 2 準備資料 insert into students...
Hive列轉行 行轉列
簡單說一下hive行轉列 列轉行的方式。這玩意sql,語法它對嗎?就擱這列轉行?浪費時間!先拿這個資料來實現乙個簡單的行轉列和列轉行 表名就都叫hero吧,英雄屬性 hero type 英雄名s hero names 英雄名 hero name 行轉列也就是上面的表1到表2。select hero ...
SQL 列轉行 行轉列 的方法
建立表 插入資料 insert into col to row user name,course,score values 張三 語文 58 insert into col to row user name,course,score values 張三 數學 34 insert into col t...