日产量表
一个内机对应一个外机 一个外机对应多个内机
id 机型 产量 类型 关系(指向外机)
1 kn1 100 内机 12
2 kn2 200 内机 12
3 kn3 700 内机 12
4 kn4 200 内机 12
5 kn5 200 内机 14
6 kn6 200 内机 14
7 kn7 500 内机 13
8 kn8 200 内机 14
9 kn9 200 内机 15
10 kn10 4000 内机 15
11 kn11 200 内机 15
12 kw1 400 外机 0
13 kw2 800 外机 0
14 kw3 900 外机 0
15 kw4 200 外机 0
"
查询SQL怎么写
我想实现这个功能.

一个内机对应一个外机 一个外机对应多个内机
机型 产量 类型 配套
kn1 100 内机 100
kn2 200 内机 200
kn3 700 内机 100
kn4 200 内机 0
kn5 200 内机 200
kn6 200 内机 200
kn7 500 内机 500
kn8 200 内机 200
kn9 200 内机 200
kn10 4000 内机 0
kn11 200 内机 0
kw1 400 外机 0
kw2 800 外机 0
kw3 900 外机 0
kw4 200 外机 0
"配套算法: 
内1 配套量       外>=内1?内1:外
内2 配套量       外-内1>=内2?内2:外-内1 
内3 配套量       外-内1-内2>=内3?内3:外-内1-内2   "

解决方案 »

  1.   


    with t1 as(
    select 1 id,'kn1' 机型,100 产量,'内机' 类型,12 关系 from dual
    union all
    select 2,'kn2',200,'内机',12 from dual
    union all
    select 3,'kn3',700,'内机',12 from dual
    union all
    select 4,'kn4',200,'内机',12 from dual
    union all
    select 5,'kn5',200,'内机',14 from dual
    union all
    select 6,'kn6',200,'内机',14 from dual
    union all
    select 7,'kn7',500,'内机',13 from dual
    union all
    select 8,'kn8',200,'内机',14 from dual
    union all
    select 9,'kn9',200,'内机',15 from dual
    union all
    select 10,'kn10',4000,'内机',15 from dual
    union all
    select 11,'kn11',200,'内机',15 from dual
    union all
    select 12,'kw1',400,'外机',0 from dual
    union all
    select 13,'kw2',800,'外机',0 from dual
    union all
    select 14,'kw3',900,'外机',0 from dual
    union all
    select 15,'kw4',200,'外机',0 from dual
    ),
    t2 as(
    select t1.*,(case 关系 when 0 then 0 else sum(产量) over (partition by 关系 order by id) end) diff from t1
    )
    select t2.机型,t2.产量,t2.类型,
    (case when t1.产量 is null then 0 
     when t1.产量>=t2.diff then t2.产量 
     else (case when t1.产量-t2.diff+t2.产量>0 then t1.产量-t2.diff+t2.产量 else 0 end) end) 配套
    from t2 left join t1 on t2.关系=t1.id
    order by t2.id;
    /*
    机型   产量                     类型     配套                     
    ---- ---------------------- ------ ---------------------- 
    kn1  100                    内机   100                    
    kn2  200                    内机   200                    
    kn3  700                    内机   100                    
    kn4  200                    内机   0                      
    kn5  200                    内机   200                    
    kn6  200                    内机   200                    
    kn7  500                    内机   500                    
    kn8  200                    内机   200                    
    kn9  200                    内机   200                    
    kn10 4000                   内机   0                      
    kn11 200                    内机   0                      
    kw1  400                    外机   0                      
    kw2  800                    外机   0                      
    kw3  900                    外机   0                      
    kw4  200                    外机   0 
    */