比较 DB2 表中的两行并比较第二个表中的相应数据

问题描述

我有一个可以由交易 ID t_id 唯一标识的交易列表。这些交易按 type 'D'(借方)或 'C'(贷方)分类。某些交易会附带有关业务合作伙伴及其费用的附加信息 (addinfo = 'Y')

信用交易只能与相应的借记交易配对存在(如我的示例所示)。借记交易没有此类限制。

TRANSACT
- t_id -|- type -|- price -|- addinfo
--------------------------------------
100001  |   D    |   2000  |        Y
100002  |   C    |  -2000  |        Y
100003  |   D    |   1000  |        Y
100004  |   C    |  -1000  |        Y
100005  |   D    |   3000  |        N   
100006  |   D    |   2000  |        Y
100007  |   C    |   1000  |        Y
PTRANSACT
- t_id -|- partner -|- charge
--------|-----------|--------
100001  |      AAA  |     200
100001  |      BBB  |     400
100002  |      AAA  |    -200
100002  |      BBB  |    -400
100003  |      AAA  |     100
100003  |      BBB  |     200
100004  |      AAA  |    -100
100006  |      CCC  |     600
100007  |      CCC  |    -300

我需要找到一种方法来仅输出不是 (!) 后跟 Credit 交易的借方交易,以便两个交易相互抵消。只有在两个交易都有完全相同的合作伙伴并且每个合作伙伴的两个费用总和为零时,它们才会相互抵消。

在我的示例中,事务 100001100002 必须被忽略。因此,输出应该如下所示:

- t_id -|- type -|- price -|- addinfo
--------------------------------------
100003  |   D    |   1000  |        Y
100005  |   D    |   3000  |        N   
100006  |   D    |   2000  |        Y

我对 DB2 和 sql 还很陌生。我尝试组合多个 EXISTS()JOIN 语句,但最终还是丢失了事务 100003

一旦我可以访问我的工作站,我就会在星期一用我以前的尝试更新我的帖子。


编辑: 似乎我对预期结果的描述有点误导。我在我的问题中编辑了所需的结果表(有一个错字)。

我基本上需要将 PTRANSACT 中对应于 TRANSACT 中的“D”事务的所有数据(例如 t_id=100001)与 PTRANSACT 中对应的所有行进行比较到“C”事务(始终为 t_id+1,例如 100002)。

我知道如何选择我的“D”交易以及如何找到相应的“C”交易。我的主要问题是从 PTRANSACT获取所有数据(每个一组 n 行),并将两组作为一个整体(而不是逐行)进行比较。

解决方法

 WITH TRANSACTIONS(T_ID,TYPE,PRICE,ADD_INFO)AS
 (
   SELECT 100001,'D',2000,'Y' UNION ALL
   SELECT 100002,'C',-2000,'Y'  UNION ALL
   SELECT 100003,1000,'Y'  UNION ALL
   SELECT 100004,-1000,'Y'   UNION ALL
   SELECT 100005,3000,'N'  UNION ALL  
   SELECT 100006,'Y'  UNION ALL
   SELECT 100007,'Y'   
),PTTRANSACT(T_ID,PARTNER,CHARGE) AS
(
  SELECT 100001,'AAA',200 UNION ALL
  SELECT 100001,'BBB',400 UNION ALL
  SELECT 100002,-200 UNION ALL
  SELECT 100002,-400 UNION ALL
  SELECT 100003,100 UNION ALL
  SELECT 100003,200 UNION ALL
  SELECT 100004,-100 UNION ALL
  SELECT 100006,'CCC',600 UNION ALL
  SELECT 100007,-300 
),PTTRANSACT_ROW_NUMBER AS
(
   SELECT PT.T_ID,PT.PARTNER,PT.CHARGE,ROW_NUMBER()OVER(PARTITION BY PT.T_ID ORDER BY PT.PARTNER ASC)AS XCOL  
   FROM PTTRANSACT AS PT
)
SELECT T.T_ID,T.TYPE,T.PRICE,T.ADD_INFO,PT1.PARTNER AS PT1_PARTNER,PT1.CHARGE AS   CHARGE_1,PT2.PARTNER AS PT2_PARTNER,PT2.CHARGE AS CHARGE_2
FROM TRANSACTIONS AS T
LEFT JOIN PTTRANSACT_ROW_NUMBER AS PT1 ON T.T_ID=PT1.T_ID AND PT1.XCOL=1 
LEFT JOIN PTTRANSACT_ROW_NUMBER AS PT2 ON T.T_ID=PT2.T_ID AND PT2.XCOL=2 

我不确定我是否以正确的方式理解您的需求,以及此代码是否受大型机上的 DB2 支持,但您能检查一下吗

  1. TRANSACTIONS 和 PTTRANSACT - 仅代表您的表格
  2. PTTRANSACT_ROW_NUMBER 用于确定相应交易的第一条和第二条记录。然后将这些记录加入 TRANSACTIONS 以显示第一个和第二个合作伙伴等。
,

我需要找到一种方法来仅输出不是 (!) 后跟 Credit 交易的借方交易,以便两个交易相互抵消。

你似乎想要:

select t.*
from (select t.*,lead(type) over (order by t_id) as next_type,lead(price) over (order by t_id) as next_price
      from t
     ) t
where type = 'D' and
      ( not (next_type = 'C' and price + next_price = 0) or
        next_type is null
      );