需要oracle sql查询

时间:2018-12-05 08:19:40

标签: sql oracle

我有一个简单的问题。

我有一张这样的桌子:

Employee id -  Debit - Credit
    1      -   100  -  null
    1      -   200  -  null
    1      -   300  -  null
    1      -   null -  700
    1      -   null -  800
    1      -   null -  900

我想要一个生成这样的结果的查询

EmpId -credit - Debit
 1    -  100    -  700
 1    -  200    -  800
 1    -  300    -  900

在此先感谢任何可以提供帮助的人。

1 个答案:

答案 0 :(得分:0)

此查询建立两个子查询,一个用于CREDIT,一个用于DEBIT。它使用分析row_number()函数根据金额的值为每个伪造一个连接列:最低CREDIT与最低DEBIT配对,依此类推。子查询已加入FULL OUTER JOIN,以处理悬挂值。(*)

select coalesce (cr.employee_id, db.employee_id) as employee_id
       , cr.Credit
       , db.Debit
from ( select employee_id
             , credit
             , row_number() over (partition by employee_id order by credit) as rn
       from your_table
       where credit is not null ) cr
full outer join 
      ( select employee_id
             , debit
             , row_number() over (partition by employee_id order by debit) as rn
       from your_table
       where debit is not null )
on cr.employee_id = db.employee_id
and cr.rn = db.rn
order by 1, 2, 3
/

(*)显然,如果您的实际表中包含这样的连接列,而您只是没有在问题中包含它,那么您应该替换该列。如果您有一个更合适的列来订购OVER子句(例如交易日期),则相同。