SQL查找对应的否定和正面记录

时间:2016-04-25 21:18:44

标签: mysql sql sql-server accounting

我们在SQL Server中实现了一个会计数据库。实际的记帐记录在records表中,并带有以下模式(名称已更改,以保护无辜的+删除的无关列)。

`recordId` INT PRIMARY KEY
`amount` MONEY
`dateRecorded` DATE
`campaignYear` INT
`storeId` INT FOREIGN KEY (to the stores table)
`productId` INT FOREIGN KEY (to the products table)

添加了一些不良记录。业务规则阻止我们简单地删除记录,因此他们必须使用相同金额的负记录清零(即$ 4,521记录被清零并记录 - $ 4,521记录)。

问题是一些负面记录与不正确的productId有关。

我需要一个查询,显示在同一个campaignYear中与不同productId绑定的所有相反金额的记录。

结果集看起来像这样:

recordId   | amount   | dateRecorded | campaignYear | storeId | productId
11545      | 1132.13  | '2015-05-14' | 2015         | 45      | 1729
90463      | -1132.13 | '2015-08-02' | 2015         | 45      | 2402
25487      | 9300.00  | '2011-01-13' | 2010         | 122     | 85060
67953      | -9300.00 | '2014-06-06' | 2010         | 122     | 11348
01045      | 5045.99  | '2001-11-29' | 2001         | 3       | 105
32468      | -5045.99 | '2016-08-01' | 2001         | 3       | 109

注意每对正/负记录的相同storeId但不同的productId。

我真的不知道怎么回事。

提前致谢!

1 个答案:

答案 0 :(得分:1)

使用exists

select * from tablename t
where exists (select 1 from tablename t1
              where t.amount = -1*t1.amount 
              and t.productid <> t1.productid 
              and t.campaignyear = t1.campaignyear
              and t.storeid = t1.storeid)

使用self-join

select t.* 
from tablename t
JOIN tablename t1 ON t.productid <> t1.productid 
and t.campaignyear = t1.campaignyear
and t.storeid = t1.storeid
WHERE t.amount = -t1.amount
ORDER BY t.storeid, abs(t.amount)