列轉行,行轉列總結

2021-10-06 08:17:14 字數 2931 閱讀 2424

此函式在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...