--check/delete void sales
;with s1
as
(
--reverse transactions
select *,
row_number() over(partition by recordtype, TxnDateTime, TransactionIdentifier, ExternalStoreIdentifier, TillNumber, ProductItemIdentifier, ItemQuantity, SaleAmount order by recordtype, TxnDateTime, TransactionIdentifier, ExternalStoreIdentifier, TillNumber, ProductItemIdentifier, ItemQuantity, SaleAmount) as rn
from @sales
where (recordtype = 'S' and SaleAmount < 0 and ItemQuantity < 0) or (recordtype = 'R' and SaleAmount > 0 and ItemQuantity > 0)
),
s2 as
(
--regular transactions
select *,
row_number() over(partition by recordtype, TxnDateTime, TransactionIdentifier, ExternalStoreIdentifier, TillNumber, ProductItemIdentifier, ItemQuantity, SaleAmount order by recordtype, TxnDateTime, TransactionIdentifier, ExternalStoreIdentifier, TillNumber, ProductItemIdentifier, ItemQuantity, SaleAmount) as rn
from @sales
where (recordtype = 'S' and SaleAmount > 0 and ItemQuantity > 0) or (recordtype = 'R' and SaleAmount < 0 and ItemQuantity < 0)
),
s3 as
(
select s1.srn from s1 inner join s2 on s1.recordtype = s2.recordtype and s1.TxnDateTime = s2.TxnDateTime and s1.TransactionIdentifier = s2.TransactionIdentifier and s1.ExternalStoreIdentifier = s2.ExternalStoreIdentifier and s1.TillNumber = s2.TillNumber and s1.ProductItemIdentifier = s2.ProductItemIdentifier
where s1.rn = s2.rn and s1.SaleAmount = -s2.SaleAmount and s1.ItemQuantity = -s2.ItemQuantity
union
select s2.srn from s1 inner join s2 on s1.recordtype = s2.recordtype and s1.TxnDateTime = s2.TxnDateTime and s1.TransactionIdentifier = s2.TransactionIdentifier and s1.ExternalStoreIdentifier = s2.ExternalStoreIdentifier and s1.TillNumber = s2.TillNumber and s1.ProductItemIdentifier = s2.ProductItemIdentifier
where s1.rn = s2.rn and s1.SaleAmount = -s2.SaleAmount and s1.ItemQuantity = -s2.ItemQuantity
)
delete s from @sales s inner join s3 on s.srn = s3.srn