首页 > 解决方案 > 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 值)

标签: sql-server

解决方案


似乎你可以用几个窗口条件来做到这一点SUM。但是请注意,结果与您的预期结果匹配,但我假设那是因为您的预期结果是错误的。您声明所需的逻辑是"(previous)endinv+(qty-qty1)",但是,当seq4nma,值endinvin 17。然而,应用你的逻辑,你有17 + 11 - 9which 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);

db<>小提琴


推荐阅读