我正在尝试从SQL数据库生成报告。
数据为交易记录,有时由于操作员错误而输入了错误的记录,后者为更正此错误而输入了相同的记录,但数量为负。
即
ID, DESC , QTY
0 , ITEM1 , 2
1 , ITEM2 , 1
2 , ITEM3 , 2 // This record and
3 , ITEM2 , 1
4 , ITEM3 , -2 // this record cancel out
我想查询一个查询,该查询对除了ID之外相同并且在QTY上具有相反符号且不包括在结果中的行对。
类似于以下内容。
ID, DESC , QTY
0 , ITEM1 , 2
1 , ITEM2 , 1
3 , ITEM4 , 1
在查询中实现此目的最简单的方法是什么?我一直在考虑聚合SUM函数的思路,但是我只想删除QTY值相反但幅度相等的行。
答案 0 :(得分:1)
您可以使用left join
反样式来逐出存在相同desc
而相反qty
的另一条记录的记录。
select t.*
from mytable t
left join mytable t1 on t1.desc = t.desc and t1.qty = - t.qty
where t1.id is null
或带有关联子查询的not exists
条件:
select t.*
from mytable t
where not exists (
select 1
from mytable t1
where t1.desc = t.desc and t1.qty = - t.qty
)
答案 1 :(得分:1)
这很痛苦。您问题的直接答案是not exists
。但是,您需要注意重复项,因此建议您先枚举值:
with t as (
select t.*,
row_number() over (partition by desc, qty order by id) as seqnum
from transactions t
)
select t.*
from t
where not exists (select 1
from t t2
where t2.desc = t.desc and
t2.seqnum = t.seqnum and
t2.qty = - t.qty
);