Oracle的列轉行和對流資料查詢SQL指令碼

2021-08-14 08:22:25 字數 1851 閱讀 6665

需求:對發件地和目的地的資料進行對流情況查詢,

即對流情況的兩條資料。

目前已有的資料結構情為:

想要達到的結果為:

根據已有目錄結構及維度表,進行關聯得到如下結構:

create

table test_20180104 as

select d1.domain_name 發件地1,

d2.domain_name 目的地1,

sum(t1.dcl_qj) 取件達成率1,

sum(t1.dcl_zy) 轉運達成率1,

sum(t1.dcl_pj) 派件達成率1,

sum(t1.dcl) 全程達成率1,

d2.domain_name 發件地2,

d1.domain_name 目的地2,

sum(t2.dcl_qj) 取件達成率2,

sum(t2.dcl_zy) 轉運達成率2,

sum(t2.dcl_pj) 派件達成率2,

sum(t2.dcl) 全程達成率2

from t_se_qcsx_zxwdpm t1

join dim_domain d1

on t1.site_start = d1.domain_id

join dim_domain d2

on t1.site_end = d2.domain_id

left

join t_se_qcsx_zxwdpm t2

on t1.site_start = t2.site_end

and t1.site_end = t2.site_start

where t1.type = 1

group

by d1.domain_name, d2.domain_name

order

bysum(t1.dcl) desc

查詢結果:

當前的表結構已可供前台處理使用,後面進一步優化處理,虛擬出來乙個序號,對各行字段進行奇偶數賦值,sql如下:

select 序號,發件地,目的地,取件達成率,轉運達成率,派件達成率,全程達成率 from (

--對奇數行賦值序號

select (2*rownum-1) 序號,t1.發件地1 發件地,t1.目的地1 目的地,t1.取件達成率1 取件達成率,t1.轉運達成率1 轉運達成率,t1.派件達成率1 派件達成率,t1.全程達成率1 全程達成率

from test_20180104 t1

union

all--對偶數行賦值序號

select

2*rownum 序號,t2.發件地2 發件地,t2.目的地2 目的地,t2.取件達成率2 取件達成率,t2.轉運達成率2 轉運達成率,t2.派件達成率2 派件達成率,t2.全程達成率2 全程達成率

from test_20180104 t2

) order

by 序號

;

查詢結果為:

至此,查詢結束,步驟稍顯複雜,但處理的邏輯還可以進一步優化,有時間再來考慮怎麼優化吧。

oracle的列轉行

首先建立測試環境 create table test1 user account varchar2 100 signup date date,user email varchar2 100 friend1 email varchar2 100 friend2 email varchar2 100 f...

Oracle行轉列和列轉行

1.1 初始測試資料 表結構 test tb grade sql 1 create table test tb grade 2 3 id number 10 not null,4 user name varchar2 20 char 5 course varchar2 20 char 6 score...

Oracle行轉列和列轉行

一 行轉列 1.1 初始測試資料 表結構 test tb grade sql 1 create table test tb grade 2 3 id number 10 not null,4 user name varchar2 20 char 5 course varchar2 20 char 6...