Sql 两列之间的运行差异

Sql 两列之间的运行差异,sql,sum,case,heidisql,Sql,Sum,Case,Heidisql,我想计算当saldo 1低于saldo 2时的运行差异 下面您可以找到我的数据集 我希望得到以下结果 我用子查询和不同的方法尝试了很多东西来寻找差异。我发现了许多使用一个值进行汇总的示例,等等。但是我不能让我的条件语句工作,如果我只做没有条件语句的干净代码,我的值总是错误的 这是我目前的代码。我正在使用分区,因为我想在ID更改时重置 IF SALDO1 < SALDO2 BEGIN SELECT ID, SALDO1, SALDO2, SUM(SALDO2 - SALDO1)

我想计算当saldo 1低于saldo 2时的运行差异

下面您可以找到我的数据集

我希望得到以下结果

我用子查询和不同的方法尝试了很多东西来寻找差异。我发现了许多使用一个值进行汇总的示例,等等。但是我不能让我的条件语句工作,如果我只做没有条件语句的干净代码,我的值总是错误的

这是我目前的代码。我正在使用分区,因为我想在ID更改时重置

IF SALDO1 < SALDO2
BEGIN
SELECT ID, SALDO1, SALDO2, 
    SUM(SALDO2 - SALDO1) over (PARTITION BY ID ORDER BY ID) as RunningDifference
END

ELSE 
BEGIN 
   '0'  
END

FROM test2;
如果SALDO1

谢谢大家!

您似乎希望在窗口sum中使用条件语句:

select id, saldo1, saldo2, 
    case when saldo1 < saldo2   
        then sum(case when saldo1 < saldo2 then saldo2 - saldo1 else 0 end) 
            over (partition by id order by ordering_id) 
        else 0
    end as runningdifference
from test2

请注意,您的
over()
子句不稳定:
partitionbyid orderbyid
没有提供分区内行的一致排序标准:所有行都是tie,因此所有行最终都加在一起。您需要一个确定的排序标准来实现您想要的结果,我假设
ordering\u id

您似乎希望在窗口和内使用条件语句:

select id, saldo1, saldo2, 
    case when saldo1 < saldo2   
        then sum(case when saldo1 < saldo2 then saldo2 - saldo1 else 0 end) 
            over (partition by id order by ordering_id) 
        else 0
    end as runningdifference
from test2

请注意,您的
over()
子句不稳定:
partitionbyid orderbyid
没有提供分区内行的一致排序标准:所有行都是tie,因此所有行最终都加在一起。你需要一个确定的排序标准来实现你想要的结果,我假设
排序\u id

你似乎知道当
saldo2
大于
saldo
时运行的差异是什么。那就是

select t.*,
       (case when saldo2 > saldo1
             then sum(case when saldo2 > saldo1 then saldo2 - saldo1 else 0 end) over (partition by id order by <ordering column>)
             else 0
        end)
from test2 t;
选择t.*,
(当saldo2>saldo1时的情况)
然后求和(当saldo2>saldo1,然后saldo2-saldo1 else 0结束时的情况)(按id划分按顺序)
其他0
(完)
从试验2t;

请注意,您的问题以表示顺序的列为前提。这应该是
orderby
的参数,而不是
id
(用于分区)。SQL表表示无序集。除非列指定了该信息,否则没有排序。

您似乎知道当
saldo2
大于
saldo
时,运行差异是什么。那就是

select t.*,
       (case when saldo2 > saldo1
             then sum(case when saldo2 > saldo1 then saldo2 - saldo1 else 0 end) over (partition by id order by <ordering column>)
             else 0
        end)
from test2 t;
选择t.*,
(当saldo2>saldo1时的情况)
然后求和(当saldo2>saldo1,然后saldo2-saldo1 else 0结束时的情况)(按id划分按顺序)
其他0
(完)
从试验2t;


请注意,您的问题以表示顺序的列为前提。这应该是
orderby
的参数,而不是
id
(用于分区)。SQL表表示无序集。除非列指定了该信息,否则没有排序。

您使用的是哪种dbms?我在HeidiSQLSQL表中这样做,但没有保证它们的顺序。甚至不是一个含蓄的。如果要保证行的处理顺序,必须添加另一列以在ORDER BY中使用。谢谢!我可以看出这是我的主要问题,您使用的是哪种dbms?我是在HeidiSQLSQL中这样做的。SQL表对它们没有保证的顺序。甚至不是一个含蓄的。如果要保证行的处理顺序,必须添加另一列以在ORDER BY中使用。谢谢!我知道这是我的主要问题谢谢你的回答!尝试了您的代码,但它始终只返回50,并更改了0的位置。@Kasper:答案中解释了这一点;您需要一个确定性的
orderby
子句。因此,我需要添加一个额外的列来指定订单id的确切顺序?我想我明白你的意思。基本上,我需要一个列来指定id实际上是关于什么的。然后用它来订购物品。该ID不能用于此目的。@Kasper:是的,的确如此。谢谢。我必须试一下!谢谢你的回答!尝试了您的代码,但它始终只返回50,并更改了0的位置。@Kasper:答案中解释了这一点;您需要一个确定性的
orderby
子句。因此,我需要添加一个额外的列来指定订单id的确切顺序?我想我明白你的意思。基本上,我需要一个列来指定id实际上是关于什么的。然后用它来订购物品。该ID不能用于此目的。@Kasper:是的,的确如此。谢谢。我必须试一下!非常感谢。我可以需要添加额外的列并尝试一下!非常感谢。我可以需要添加额外的列并尝试一下!