我们在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。
我真的不知道怎么回事。
提前致谢!
答案 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)