我有一个简单的问题。
我有一张这样的桌子:
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
在此先感谢任何可以提供帮助的人。
答案 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子句(例如交易日期),则相同。