【问题标题】:Running Difference between two columns两列之间的运行差异
【发布时间】:2020-12-06 21:00:26
【问题描述】:

我想计算 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;

谢谢!

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 我在 HeidiSQL 中这样做
  • SQL 表对它们没有保证顺序。甚至不是隐含的。如果您想保证行的处理顺序,您必须在 ORDER BY 中添加另一列。
  • 谢谢!我可以看到这是我的主要问题

标签: sql sum case heidisql


【解决方案1】:

您似乎想要在窗口总和周围和内部使用条件语句:

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

如果你的数据库支持greatest(),我们可以缩短内部表达式:

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

请注意,您的 over() 子句不稳定:partition by id order by id 不提供分区内行的一致排序标准:所有行都是关联的,因此所有行最终都加在一起。你需要一个确定的排序标准来达到你想要的结果,我假设ordering_id

【讨论】:

  • 谢谢解答!尝试了您的代码,但它始终返回 50 并更改 0 的位置。
  • @Kasper:答案中对此进行了解释;你需要一个确定性的order by 子句。
  • 那么我需要添加一个额外的列来指定订单id的确切顺序吗?我想我明白你的意思。基本上,我需要指定 id 实际含义的列。并用它来订购物品。该 ID 不能用于此目的。
  • @Kasper:是的,确实如此。
  • 谢谢。我得试试看!
【解决方案2】:

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;

请注意,您的问题预设了一个表示排序的列。那应该是order by 的参数,而不是id(用于分区)。 SQL 表代表 无序 集合。除非列指定该信息,否则没有排序。

【讨论】:

  • 谢谢!我可能需要添加额外的列并尝试一下!
猜你喜欢
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
相关资源
最近更新 更多