在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