我有以下问题:我有一个表格,其中包含以下值:
我想查询'取消'添加到零的行,这里例如1和2或2和3或2和4所以最后我可以得到下面的值表
但不是它们的总和(1800)我想要它们分开,我不关心它选择哪个ID只是想要不加零的数字,谢谢!
大家好,感谢您的帮助,是的,其实我想看看是否有一个简单的基本SQL解决方案(klin答案非常好,但看起来它有一个Postgres自定义函数,因此这就是为什么我在尝试在Access中这样做的原因是有一天在工作中有人带着这个问题来找我(一些财务人员,你知道,他们有最奇怪的要求)而且我想出了一种在Excel和VBA上做这个的方法但是我想知道是否有一种方法可以直接在SQL上执行此操作,再次感谢!对于melpomene的评论,不,400,500和-900不应该取消,只有具有相同值,符号相反的对,谢谢。
答案 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
语句)。