SQLserver重新累计问题

yiminglian 2022-08-02 11:21:34

WITH t AS(
SELECT '1' dh ,22 qty
UNION
SELECT '1' ,33 
UNION
SELECT '1',7
UNION
SELECT '1',80
UNION
SELECT '2',55
UNION
SELECT '2',66
),
b AS (
SELECT'1' dh,'83'M
UNION
SELECT '2' dh,'70'm
)
SELECT t.dh,
       t.qty,SUM(qty)OVER (PARTITION BY t.dh ORDER BY t.dh  ROWS   UNBOUNDED PRECEDING),b.M FROM t LEFT JOIN b ON b.dh = t.dh

dh qty (无列名)    M
1    7    7           83
1    22    29       83
1    33    62       83
1    80    142     83
2    55    55       70
2    66    121    70

如何做到按M列的值重新累计 比如第四行累计后是142超过83要重新累计结果就80 如果下方有一行qty 是2 累计成82 如果是qty 是 4就不能累计了 最后一行同样累计结果大于70 需要重新累计成66

...全文
124 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
; 
WITH t AS(
SELECT '1' dh ,22 qty
UNION
SELECT '1' ,33 
UNION
SELECT '1',7
UNION
SELECT '1',80
UNION
SELECT '2',55
UNION
SELECT '2',66
),
b AS (
SELECT'1' dh,'83'M
UNION
SELECT '2' dh,'70'm
),
T1 AS (
SELECT t.dh,
       t.qty,
       ---用不到这一行SUM(qty)OVER (PARTITION BY t.dh ORDER BY t.dh  ROWS   UNBOUNDED PRECEDING),
       b.M 
       FROM t LEFT JOIN b ON b.dh = t.dh),
T2 AS (
SELECT *,ROW_NUMBER() OVER(PARTITION BY dh ORDER BY qty) RN FROM T1
),
RES AS (
SELECT * FROM T2 WHERE RN = 1
UNION ALL
SELECT A.dh,CASE WHEN A.qty+B.qty>B.M THEN A.qty ELSE A.qty+B.qty END,A.M,A.RN FROM T2 A,RES B WHERE A.RN = B.RN+1 AND A.dh = B.dh
)
SELECT * FROM RES ORDER BY DH,RN
  • 打赏
  • 举报
回复 1
@锟斤拷锟斤拷 我那种分组方式有办法简化代码么
  • 举报
回复
@yiminglian 在开窗函数中判断暂时没什么思路。另外这张表需要一个id,我现在是按qty从小到大排序的,如果需要顺序最好加个id,然后把27行的qty换成id
  • 举报
回复 1
展开其他2条回复
发帖
MS-SQL Server

3.3w+

社区成员

MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
帖子事件
创建了帖子
2022-08-02 11:21
社区公告
暂无公告