SQL 查找对应的负面和正面记录
SQL Find Corresponding Negative and Positive Records
我们在 SQL 服务器中实现了一个会计数据库。实际会计记录在 records
table 中,具有以下架构(更改名称以保护无辜者 + 删除不相关的列)。
`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 美元的记录清零)。
问题是一些负面记录与不正确的产品 ID 相关联。
我需要一个查询来显示在同一活动年内与不同产品 ID 相关联的所有记录,金额相反。
结果集看起来像这样:
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
注意每对 positive/negative 记录的商店 ID 相同但产品 ID 不同。
我真的不知道该怎么做。
提前致谢!
使用 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)
我们在 SQL 服务器中实现了一个会计数据库。实际会计记录在 records
table 中,具有以下架构(更改名称以保护无辜者 + 删除不相关的列)。
`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 美元的记录清零)。
问题是一些负面记录与不正确的产品 ID 相关联。
我需要一个查询来显示在同一活动年内与不同产品 ID 相关联的所有记录,金额相反。
结果集看起来像这样:
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
注意每对 positive/negative 记录的商店 ID 相同但产品 ID 不同。
我真的不知道该怎么做。
提前致谢!
使用 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)