sql-server - sql中的当前行+上一行
问题描述
我有一张像
beginv nm nm1 qty qty1 endinv seq
0 a ab1 5 7 0 1
0 a ab2 15 7 0 2
0 a ab3 11 9 0 3
0 a ab3 11 9 0 4
0 a ab3 11 9 0 5
0 b ab2 10 14 0 1
0 b ab3 11 9 0 2
0 c ab1 11 9 0 1
0 c ab2 15 9 0 2
0 c ab3 15 9 0 3
有没有办法显示如下
beginv nm nm1 qty qty1 endinv seq
0 a ab1 5 7 7 1
0 a ab2 15 7 15 2
0 a ab3 11 9 17 3
0 a ab3 11 9 17 4
0 a ab3 11 9 17 5
0 b ab2 10 14 14 1
0 b ab3 11 9 16 2
0 c ab1 11 9 9 1
0 c ab2 15 9 15 2
0 c ab3 15 9 21 3
如果 seq 为 1,则 endinv=qty1 else (previous)endinv+(qty-qty1) 和相同的 nm,nm1 重复然后前一个 endiv(例如,“a”和“ab3”重复三次,具有相同的 endinv 值)
解决方案
似乎你可以用几个窗口条件来做到这一点SUM
。但是请注意,结果与您的预期结果不匹配,但我假设那是因为您的预期结果是错误的。您声明所需的逻辑是"(previous)endinv+(qty-qty1)",但是,当seq
值4
和nm
时a
,值endinv
in 17
。然而,应用你的逻辑,你有17 + 11 - 9
which equals 19
not 17
。
SELECT beginv,
nm,
nm1,
qty,
qty1,
SUM(CASE seq WHEN 1 THEN qty1 ELSE qty END) OVER (PARTITION BY nm ORDER BY seq ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) -
SUM(CASE seq WHEN 1 THEN 0 ELSE qty1 END) OVER (PARTITION BY nm ORDER BY seq ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS endinv,
seq
FROM (VALUES(0,'a','ab1',5 ,7 ,0,1),
(0,'a','ab2',15,7 ,0,2),
(0,'a','ab3',11,9 ,0,3),
(0,'a','ab3',11,9 ,0,4),
(0,'a','ab3',11,9 ,0,5),
(0,'b','ab2',10,14,0,1),
(0,'b','ab3',11,9 ,0,2),
(0,'c','ab1',11,9 ,0,1),
(0,'c','ab2',15,9 ,0,2),
(0,'c','ab3',15,9 ,0,3))V(beginv,nm,nm1,qty,qty1,endinv,seq);
推荐阅读
- java - 我在 jpanel 上替换 jmenubar 时遇到问题
- c# - Roslyn 代码分析从无错误解决方案返回错误的构建错误
- arrays - 如果某一列中存在一个数字,则在与该数字对应的另一列中查找一个值
- c# - 即使没有给出 int,C# 也会返回错误“无法将类型“int”隐式转换为“字符串”
- gcc - 无法构建台面的静态库(libGL.a)
- python - Matplotlib 设置打印的绘图区域大小
- javascript - HighCharts 如何将实时系列数据集添加到现有图表
- javascript - Node.js:如何从 MongoDB 中的光标返回当前文档
- mysql - 如何在不使用 CTE 由于版本错误的情况下重写 MySQL CTE 查询?
- java - 如何向 quarkus 注册注释处理器