有表A
ID order num
1 1 5
1 3 2
1 2 6
2 2 3
2 3 4
以及表B
ID Num
1 6
2 8
要求是 将A按ID分组后,通过order 升序排序。 然后用A表Num按照A表排序顺序依次相减B中的Num,如果序号1的Num不够B的NUm大,那么移到序号2,以此类推,直到表B被减到0 或者 A表没有数据给B相减为止。
列如 表A排序后为
ID order num
1 1 5
1 2 6
1 3 2
2 2 3
2 3 4
那么对于B表来说 1的Num 是6,那么A的 order=1的时候Num=5,所以不够6减,就变成0了,那么B的num还有1,
用A的order=2 ,num=6 减1 那就是5.
有点乱。我也不好表述
最后A结果为
ID oder num
1 1 0
1 2 5
1 3 2
2 2 0
2 3 -1
------解决思路----------------------
;WITH T1 AS(
SELECT ROW_NUMBER()OVER(PARTITION BY ID ORDER BY [order])RN1,*
FROM A
)
,CTE AS(
SELECT T1.ID,T1.[order]
,T1.Num-T2.Num Num
,T1.RN1,T2.Num-T1.Num [Balance]
FROM T1 JOIN B T2 ON T1.ID=T2.ID AND T1.RN1=1
UNION ALL
SELECT T1.ID,T1.[order]
,T1.Num-T2.[Balance]
,T1.RN1,T2.[Balance]-T1.Num
FROM T1 JOIN CTE T2 ON T1.ID=T2.ID AND T2.[Balance]>0 AND T1.RN1=T2.RN1+1
)
SELECT T3.ID,T3.[order]
,CASE WHEN T4.ID IS NULL OR T3.Num>0 THEN T3.Num ELSE 0 END Num
FROM CTE T3
LEFT JOIN T1 AS T4 ON T3.ID=T4.ID AND T3.RN1+1=T4.RN1
UNION ALL
SELECT T3.ID,T3.[order],T3.Num
FROM A AS T3
LEFT JOIN CTE AS T4 ON T3.ID=T4.ID AND T3.[order]=T4.[order]
WHERE T4.ID IS NULL
ORDER BY 1,2