sql解惑 41 预算问题 create table items( item_nbr number(8), item_descr varchar2(20) ); insert into items values(10,'item 10'); insert into items values(20,'item 20'); insert into items values(30,'item 30'); insert into items values(40,'item 40'); insert into items values(50,'item 50'); SQL> select * from items; ITEM_NBR ITEM_DESCR ---------- ---------------------------------------- 10 item 10 20 item 20 30 item 30 40 item 40 50 item 50 create table actuals( item_nbr number(8), actual_amt number(8,2), check_nbr varchar2(20) ); insert into actuals values(10,300.00,'1111'); insert into actuals values(20,325.00,'2222'); insert into actuals values(20,100.00,'3333'); insert into actuals values(30,525.00,'1111'); SQL> select * from actuals; ITEM_NBR ACTUAL_AMT CHECK_NBR ---------- ---------- ---------------------------------------- 10 300 1111 20 325 2222 20 100 3333 30 525 1111 create table estimates( item_nbr number(8), estimated_amt number(8,2) ); insert into estimates values(10,'300.00'); insert into estimates values(10,'50.00'); insert into estimates values(20,'325.00'); insert into estimates values(20,'110.00'); insert into estimates values(40,'25.00'); SQL> select * from estimates; ITEM_NBR ESTIMATED_AMT ---------- ------------- 10 300 10 50 20 325 20 110 40 25 要求获得以下结果: ITEM_NBR ITEM_DESCR ACTUAL_AMT ESTIMATED_AMT DEX ---------- ---------------------------------------- ---------- ------------- ---------------------------------------- 10 item 10 300 350 1111 20 item 20 425 435 mixed 30 item 30 525 1111 40 item 40 25 ====================================================================================================================================== select case when a.item_nbr is null then e.item_nbr when a.item_nbr is not null then a.item_nbr end as item_nbr,i.item_descr,a.actual_amt,e.estimated_amt,a.dex from (select distinct item_nbr, sum(actual_amt)over(partition by item_nbr) actual_amt, case when count(item_nbr)over(partition by item_nbr)>1 then 'mixed' when count(item_nbr)over(partition by item_nbr)=1 then check_nbr end as dex from actuals )a full outer join (select min(item_nbr) item_nbr,sum(estimated_amt) estimated_amt from estimates group by item_nbr) e on a.item_nbr = e.item_nbr inner join items i on (e.item_nbr = i.item_nbr or a.item_nbr = i.item_nbr) order by a.item_nbr,e.item_nbr ITEM_NBR ITEM_DESCR ACTUAL_AMT ESTIMATED_AMT DEX ---------- ---------------------------------------- ---------- ------------- ---------------------------------------- 10 item 10 300 350 1111 20 item 20 425 435 mixed 30 item 30 525 1111 40 item 40 25