我在SQL服务器中有一个临时表,如下所示
????????????????????????????????????
?Serial ? Account ? Due ? Balance ?
?1 ? A1 ? 1000 ? 3100 ?
?2 ? A1 ? 1000 ? 3100 ?
?3 ? A1 ? 1000 ? 3100 ?
?4 ? A1 ? 1000 ? 3100 ?
?1 ? A2 ? 100 ? 3100 ?
?2 ? A2 ? 100 ? 3100 ?
?1 ? B1 ? 1000 ? 1100 ?
?2 ? B1 ? 1000 ? 1100 ?
?1 ? B2 ? 100 ? 1100 ?
?2 ? B2 ? 100 ? 1100 ?
????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
我想确定将收集到期的行.A1和A2到期将从3100收取,B1和B2将从1100收集.
首先我使用累积的Due如下
?????????????????????????????????????????????????
?Serial ? Account ? Due ? Cumulative ? Balance ?
?1 ? A1 ? 1000 ? 1000 ? 3100 ?
?2 ? A1 ? 1000 ? 2000 ? 3100 ?
?3 ? A1 ? 1000 ? 3000 ? 3100 ?
?4 ? A1 ? 1000 ? 4000 ? 3100 ?
?1 ? A2 ? 100 ? 100 ? 3100 ?
?2 ? A2 ? 100 ? 200 ? 3100 ?
?1 ? B1 ? 1000 ? 1000 ? 1100 ?
?2 ? B1 ? 1000 ? 2000 ? 1100 ?
?1 ? B2 ? 100 ? 100 ? 1100 ?
?2 ? B2 ? 100 ? 200 ? 1100 ?
?????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
现在我想选择以下行作为输出
?????????????????????????????????????????????????
?Serial ? Account ? Due ? Cumulative ? Balance ?
?1 ? A1 ? 1000 ? 1000 ? 3100 ?
?2 ? A1 ? 1000 ? 2000 ? 3100 ?
?3 ? A1 ? 1000 ? 3000 ? 3100 ?
?1 ? A2 ? 100 ? 100 ? 3100 ?
?1 ? B1 ? 1000 ? 1000 ? 1100 ?
?1 ? B2 ? 100 ? 100 ? 1100 ?
?????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
这是我被困的地方.如何在不使用游标或循环的情况下选择这些行.所有我想用select语句和窗口函数来做这件事.谢谢.
可能的解决方案:如果表可以更新如下,则问题将得到解决.
??????????????????????????????????????????????
?Serial ? Account ? Due ? Balance Remaining ?
?1 ? A1 ? 1000 ? 3100 ?
?2 ? A1 ? 1000 ? 2100 ?
?3 ? A1 ? 1000 ? 1100 ?
?4 ? A1 ? 1000 ? 100 ?
?1 ? A2 ? 100 ? 100 ?
?2 ? A2 ? 100 ? 0 ?
?1 ? B1 ? 1000 ? 1100 ?
?2 ? B1 ? 1000 ? 100 ?
?1 ? B2 ? 100 ? 100 ?
?2 ? B2 ? 100 ? 0 ?
??????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
这些案件的帐户余额等于/大于由于我们有区别更新否则它将依然如前.这里的问题是通过在A和B之间进行分区来更新行.
更新 我提供新数据集的链接,以更清楚地表达我的要求. 新数据集
最后,通过更新查询解决了这个问题。
UPDATE A
SET
A.Balance = @Balance
, @PreBalance = @Balance
, @Balance = ( CASE WHEN (@Balance IS NULL OR @AccountType <> A.AccountType)
THEN
CASE WHEN A.Balance - A.Due >= 0
THEN A.Balance
ELSE A.Balance + A.Due
END
ELSE
CASE WHEN @Balance - A.Due >= 0 AND (@Flag = 1 OR @AccountNO <> A.AccountNO)
THEN @Balance
ELSE @Balance + A.Due
END
END) - A.Due
, A.FLAG = @Flag
, @AccountNO = CASE WHEN A.Flag = 0 THEN A.AccountNO ELSE 'NoDueFoundForAcc' END
, @Flag = CASE WHEN @AccountType = A.AccountType
THEN
CASE WHEN @PreBalance = @Balance
THEN 0
ELSE 1
END
ELSE
CASE WHEN A.Balance - A.Due >= 0
THEN 1
ELSE 0
END
END
, @AccountType = A.AccountType
FROM #tempTable A
SELECT * FROM #tempTable A WHERE A.Flag = 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |