SQL,如何从以前的剩余金额中减去CTE?

时间:2018-10-06 02:04:05

标签: sql sql-server common-table-expression lag

在获取此图片的“标记”和“左”列时,我需要帮助。我尝试了CTE和滞后功能,但似乎没有任何效果。

如果我在表中有前四列,该如何计算“收货”和“左”列。

基本上,对于每个组来说,“收起”和“离开”的方式基本上是最大的,我们可以从中取出第4列。必须按照A,B,C,D的顺序取出它们。

让我知道是否有问题,我会尽力回答。

谢谢

因为人们要的是给定的记录集。这就是它的样子。我需要找出列“ taken”和“ left”的逻辑

Accountno   GroupName   MaxGroup    Amount
101          A          70           0
101          B          70           50
101          C          70          0
101          D          70          20
102          A          95          30
102          B          95           0
102          C          95           5
102          D          95           10
103          A          80           40
103          B          80          15
103          C          80          10
103          D          80           5

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以使用OUTER APPLY如下实现

DECLARE @table AS TABLE(acc_no INT, [group] CHAR(1), [maxgroup] INT, amount INT)

INSERT INTO @table VALUES
(101, 'A', 70, 0),
(101, 'B', 70, 50),
(101, 'C', 70, 0),
(101, 'D', 70, 20),
(102, 'A', 95, 30),
(102, 'B', 95, 0),
(102, 'C', 95, 5),
(102, 'D', 95, 10),
(103, 'A', 80, 40),
(103, 'B', 80,15),
(103, 'C', 80, 10),
(103, 'D', 80, 5)


SELECT t.acc_no, 
    t.[group],
    t.maxgroup,
    CASE WHEN t1.assigned = 0 THEN NULL ELSE t.amount END AS taken, 
    CASE WHEN t1.assigned = 0 THEN NULL ELSE (t.maxgroup - t1.assigned) END [left]
FROM @table t
OUTER APPLY(SELECT SUM([amount]) AS assigned 
            FROM @table t1 WHERE t1.acc_no = t.acc_no AND t1.[group] <= t.[group]) t1

输出:

    acc_no  group   maxgroup    taken   left
    101     A       70          NULL    NULL
    101     B       70          50      20
    101     C       70          0       20
    101     D       70          20      0
    102     A       95          30      65
    102     B       95          0       65
    102     C       95          5       60
    102     D       95          10      50
    103     A       80          40      40
    103     B       80          15      25
    103     C       80          10      15
    103     D       80          5       10

答案 1 :(得分:1)

$ python dir-test.py -h usage: dir-test.py [-h] [-d DIR] optional arguments: -h, --help show this help message and exit -d DIR, --dir DIR Directory to use. Default: /tmp $ python dir-test.py -d /not/real usage: dir-test.py [-h] [-d DIR] dir-test.py: error: argument -d/--dir: /not/real is not writable or does not exist. $ python dir-test.py -d ~ ,这将获得每个Accountno的MaxGroup值

max(MaxGroup) over (partition by Accountno)将累计sum(Amount) over (partition by Accountno order by GroupName)

Amount

不太了解您要求的第二列-- create the sample table DECLARE @sample AS TABLE ( Accountno int, GroupName char, MaxGroup int, Amount int ) -- insert some sample data INSERT INTO @sample VALUES (101, 'A', 70, 0), (101, 'B', 70, 50), (101, 'C', 70, 0), (101, 'D', 70, 20), (102, 'A', 95, 30), (102, 'B', 95, 0), (102, 'C', 95, 5), (102, 'D', 95, 10), (103, 'A', 80, 40), (103, 'B', 80, 15), (103, 'C', 80, 10), (103, 'D', 80, 5) -- the query select *, [left] = max(MaxGroup) over (partition by Accountno) - sum(Amount) over (partition by Accountno order by GroupName) from @sample s order by Accountno, GroupName 的逻辑是什么。看起来与我的taken

相同

demo