在SQL中使用多行细节

在SQL中使用多行细节,sql,sql-server,Sql,Sql Server,我有这个问题 我有这张桌子 Case Order Amount 1 1 50 1 2 20 1 3 25 2 1 35 2 2 40 2 3 38 3 1 45 3

我有这个问题 我有这张桌子

Case     Order          Amount
1         1               50
1         2               20
1         3               25 
2         1               35
2         2               40
2         3               38
3         1               45
3         2               50
3         3               25
所以我想要的是案例1的顺序1将从案例2的顺序1中减去金额,然后从案例2的顺序1中减去案例3的顺序1,然后案例1的顺序2减去案例2的顺序2,然后减去案例3的顺序2,依此类推 就像连锁反应

公式1订单1-订单2订单1-订单3订单1

结果一定是这样

Case     Order          Amount
1         1               50
1         2               20
1         3               25 
2         1               Result (35-50)=-15
.         .
3         1               Result (-15-45)

您需要一个相关的子查询,在这里您可以将金额相加。如您所见,公式相当简单:

select 
  mycase, 
  myorder, 
  (
    select sum(case when mycase = 1 then amount else -amount end)
    from mytable other
    where other.myorder = mytable.myorder
    and other.mycase <= mytable.mycase
  ) as amount
from mytable
order by mycase, myorder;

我将列命名为mycase和myorder,因为case和order在SQL中都是保留字。当然,您可以使用带引号的名称,而不是大小写,但我不喜欢必须引用列名。

Thorsten的解决方案可能使用了正确的逻辑,它只是在总和中使用了错误的列名:

select 
  mycase, 
  myorder, 
  (
    select sum(case when mycase = 1 then amount else -amount end)
    from mytable other
    where other.myorder = mytable.myorder
    and other.mycase <= mytable.mycase
  ) as amount
from mytable
order by mycase, myorder;

多亏了大家,我用我在这里找到的公式算出:

WITH    q AS
        (
        SELECT  *,
                ROW_NUMBER() OVER ORDER BY (num1) AS rn
        FROM    mytable
        )
SELECT  qc.*, qc.num1 - qp.num2
FROM    q qc
LEFT JOIN
        q qp
ON      qp.rn = qc.rn - 1

根据你的解释,案例2第1顺序的结果应该是50-35,而不是35-50。你能澄清一下吗?另外:您尝试了什么,您遇到了什么困难?是的,您是对的,很抱歉,谢谢我有一个Sql表,我输入了第一个值,但是当我的值超过2时,它是错误的,查询:选择A3.Case,A2.OrderCase,当A2.Seq=A3.Seq和A2.Case时,那么公式是:取第一个值,然后减去下面的所有值?50->50-35->50-35-45…?是发票材料,案例1是原始发票,保持原样,案例2是当您修改发票时,所以您将金额减去第一个金额,然后案例3是对发票的更多修改,所以您将其减去案例2,但始终必须匹配顺序,例如案例1顺序1-案例2顺序1-案例3顺序1,因此也可以使用“求和结束”来完成,因此您根本不需要子查询,但我现在没有时间编写它。很抱歉也许今天晚些时候……正如德诺思所指出的,我只是混淆了列名。看来我太匆忙了。我很高兴dnoeth能在这方面帮助你,甚至向你展示我所说的查询和。谢谢dnoeth,我的版本SQL2008R2,让我看看这是一个作品,但你只包括1个案例,它必须用于3个案例Hanks dnoeth,我的版本SQL2008R2,让我看看这是一个作品,但你只包括1个案例,它必须用于3个案例,这是一个发票行,因此如果修改发票的其中一行,必须减去具有相同订单号的前一行,这样发票可以修改N次,首先它们显示发票的原始行,然后,他们将新的金额减去前一个金额,即行号same@Luis64:AFAIK累计金额仅在SS2012中受支持。顺便说一句,这个答案和你描述的完全一样,从第一个金额中减去以下所有金额:让我更好地解释一下,例如你有发票1发票有3行详细信息和金额,有时你可以用更多的产品或很少的产品修改发票,因此,当你修改时,他们会在发票中添加新的明细行ad add 01,所以每次有人修改发票时,我都要从原始发票中减去这些行,但是行号必须等于行号,第一行保持不变same@Luis64:请检查您的示例是否返回正确的数据,它使用35-50-45,但在您对Heinz的评论中,您说它是50-35-45,这是两个查询返回的结果。
WITH    q AS
        (
        SELECT  *,
                ROW_NUMBER() OVER ORDER BY (num1) AS rn
        FROM    mytable
        )
SELECT  qc.*, qc.num1 - qp.num2
FROM    q qc
LEFT JOIN
        q qp
ON      qp.rn = qc.rn - 1