Oracle 分組排序問題

2021-08-26 05:28:21 字數 2557 閱讀 5441

a、b兩個表,分別存的是使用者的收入和支出

a表 id date user income

fid fdate       fuser   fincome

1 2018/8/1 張三 11.00

2 2018/8/2 張三 12.00

3 2018/8/2 李四 21.00

4 2018/8/3 張三 13.00

5 2018/8/3 張三 14.00

6 2018/8/3 李四 22.00

7 2018/8/3 李四 23.00

8 2018/8/3 李四 24.00

b表 id date user payment

fid fdate       fuser   fpayment

1 2018/8/2 張三 31.00

2 2018/8/2 張三 32.00

3 2018/8/2 張三 33.00

4 2018/8/2 李四 41.00

5 2018/8/3 李四 42.00

6 2018/8/3 李四 43.00

7 2018/8/3 張三 34.00

8 2018/8/3 張三 35.00

9 2018/8/3 張三 36.00

10 2018/8/4 張三 37.00

現在要求按日期、使用者對資料進行分組統計,

即:按-日期,使用者的順序,列出當前使用者每天的收入和支出

1、沒有收入和支出的不顯示

2、收入和支出有一項不為空的,則要顯示對應的資料

3、一行中同時有收入和支出兩列,兩列資料有數值的優先填寫進對應的列(補充說明,這裡的意思其實就是不允許將收入表和支出表進行補空列後union all)

最終顯示結果如下:

cdate       cuser  fincome  fpayment

12018/8/1 張三 11.00

22018/8/2 李四 21.00

41.00

32018/8/2 張三 12.00

31.00

42018/8/2 張三 32.00

52018/8/2 張三 33.00

62018/8/3 李四 22.00

42.00

72018/8/3 李四 23.00

43.00

82018/8/3 李四 24.00

92018/8/3 張三 13.00

34.00

102018/8/3 張三 14.00

35.00

112018/8/3 張三 36.00

122018/8/4 張三 37.00

用儲存過程的辦法是,對a、b兩表迴圈,匹配條件去填充資料

步驟:

1、a、b兩表group by fdate,fuser統計有哪些組和對應資料行數

2、計數 cnt,while(cnt小於a的行數或b的行數),插入一行資料,根據cnt去a、b取該組的第n條資料,為空的就填空

3、結果整理,檢查,排序

相對比較複雜,要建立幾個對應的型別和臨時表

select cdate,cuser,fincome,fpayment from (

select

coalesce(t1.fdate,t2.fdate) as cdate,

coalesce(t1.fuser,t2.fuser) as cuser,

t1.fdate,t1.fuser,

t2.fdate,t2.fuser,

t1.fincome,t2.fpayment,

t1.rw,t2.rw

from (select row_number()over(partition by fdate,fuser order by fincome) as rw,fdate,fuser,fincome from a )t1

full join

(select row_number()over(partition by fdate,fuser order by fpayment) as rw,fdate,fuser,fpayment from b )t2

on t1.fdate = t2.fdate and t1.fuser = t2.fuser and t1.rw = t2.rw

order by cdate,cuser,t1.rw,t2.rw

)tab

1、首先對a、b兩個表進行分組排序,得到對應的rw

2、full join兩張表,這個時候,就要用到rw,這樣缺少的行就會為空,同時coalesce一下兩張表,把不為空的資料填進去

3、取出需要的列

oracle分組排序

在做統計是很多情況會用到分組排序 結合談論的方法 自己建了乙個demo驗證 留在這裡以便備份 create table student2 student id number primary key,student name varchar2 30 not null create table scor...

Oracle 中分組排序取值的問題

建表語句 create table exam name varchar2 32 subject varchar2 32 score integer 資料 insert into exam values 趙柳 數學 71 insert into exam values 張三 數學 81 insert ...

oracle 實現分組排序

select t.t.rowid,rank over partition by t.classid order by t.score,t.classid from tablename t 按照classid分組,並按照classid公升序,同時分數公升序排列。注意 對於每個分組,比如classid ...