SQL只保留数字不总和为零的行

时间:2016-07-16 22:07:32

标签: sql ms-access sum

我有以下问题:我有一个表格,其中包含以下值:

  • ID:VALUE
  • 1:900
  • 2:-900
  • 3:900
  • 4:900

我想查询'取消'添加到零的行,这里例如1和2或2和3或2和4所以最后我可以得到下面的值表

  • 900
  • 900

但不是它们的总和(1800)我想要它们分开,我不关心它选择哪个ID只是想要不加零的数字,谢谢!

大家好,感谢您的帮助,是的,其实我想看看是否有一个简单的基本SQL解决方案(klin答案非常好,但看起来它有一个Postgres自定义函数,因此这就是为什么我在尝试在Access中这样做的原因是有一天在工作中有人带着这个问题来找我(一些财务人员,你知道,他们有最奇怪的要求)而且我想出了一种在Excel和VBA上做这个的方法但是我想知道是否有一种方法可以直接在SQL上执行此操作,再次感谢!对于melpomene的评论,不,400,500和-900不应该取消,只有具有相同值,符号相反的对,谢谢。

1 个答案:

答案 0 :(得分:0)

我假设我们正在寻找具有相反值的行对。

示例数据(Postgres)。

create table test (id int, val int);
insert into test values 
    (1, 900), (2, -900), (3, 900), (4, 900),
    (5, -400), (6, 400), (7, -400), (8, -400);

select * from test;

 id | val  
----+------
  1 |  900
  2 | -900
  3 |  900
  4 |  900
  5 | -400
  6 |  400
  7 | -400
  8 | -400
(8 rows)

查询:

delete from test
where id in (
    select unnest(array[id1, id2])
    from (
        select distinct on (id1) *
        from ( 
            select t1.id id1, t2.id id2
            from test t1
            join test t2
            on t1.val + t2.val = 0 and t1.id < t2.id and t1.val > 0
            ) s1
        ) s2
);

结果:

select * from test;

 id | val  
----+------
  3 |  900
  4 |  900
  5 | -400
  8 | -400
(4 rows)

您可以在没有特定Postgres功能的情况下尝试查询:

delete from test
where id in (
    select id1 
    from (
        select id1, min(id2) id2
        from (
            select t1.id id1, t2.id id2
            from test t1
            join test t2
            on t1.val + t2.val = 0 and t1.id < t2.id and t1.val > 0
            ) s1
        group by id1
        ) s2
    union all
    select id2
    from (
        select id1, min(id2) id2
        from (
            select t1.id id1, t2.id id2
            from test t1
            join test t2
            on t1.val + t2.val = 0 and t1.id < t2.id and t1.val > 0
            ) s1
        group by id1
        ) s3
);

如果您的服务器可以接受此子查询,请使用公用表表达式(with语句)。