在SQL中用循环减去值

时间:2018-11-12 14:29:13

标签: sql sql-server tsql

我坚持使用其他语言可以做的事情,所以我希望有人可以帮助我 我有两张桌子,一张是我的预算号,另一张是每个命令的剩余预算 我的工人实际情况的另一张桌子 这是我要执行的操作的示例:

表A

Command Number         Remainig Work
PO1111                      3
PO1112                     10

表B

Command Number:             Actuals:       Name     Date
PO1111                         1            A       11/06
PO1111                         1            A       11/07
PO1111                         1            B       11/06
PO1111                         1            B       11/07
PO1111                         1            B       11/08
PO1111                         1            B       11/10
PO1111                         1            B       11/11
PO1112                         1            A       11/09
PO1112                         1            A       11/10

所以最后我想要的是这样的东西:

Date    Worker     Actuals
11/06    A            1
11/07    A            1
11/06    B            1
11/07    B          Error
11/08    B          Error
11/10    B          Error
11/11    B          Error
11/09    A            1
11/10    A            1

命令号

剩余预算:32小时

工人A工作40小时,工人B工作16小时 所以我想得到这样的结果: 对于工人A:

Day:      Hours:
1           8
2           8
3           8
4           8 
5         ERROR

对于工人B:

Day       Hours
1         ERROR
2         ERROR

所以我想我应该花点时间做些事情,但是我不知道如何用我的实际值减去先前的值 所以有人可以帮助我

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您可以使用由sum划分为CommandNumber的窗口功能rows unbounded preceding

declare @A Table (CommandNumber varchar(100), RemainigWork integer)
declare @B Table (CommandNumber varchar(100), Actuals integer, Name varchar(100))

INSERT INTO @A(CommandNumber, RemainigWork) values('PO1111', 3)
INSERT INTO @b(CommandNumber, Actuals, Name) values('PO1111', 1, 'A')
INSERT INTO @b(CommandNumber, Actuals, Name) values('PO1111', 1, 'A')
INSERT INTO @b(CommandNumber, Actuals, Name) values('PO1111', 1, 'B')
INSERT INTO @b(CommandNumber, Actuals, Name) values('PO1111', 1, 'B')
INSERT INTO @b(CommandNumber, Actuals, Name) values('PO1111', 1, 'B')

select
    a.CommandNumber,
    case when sum(Actuals) over (partition by a.CommandNumber order by b.name rows unbounded preceding) > RemainigWork 
        then 
            'Error' 
        else 
            CAST(Actuals as varchar(100)) 
        end as Actuals,
    b.Name
from @A a
join @B b on a.CommandNumber = b.CommandNumber