db2 仅为事务代码LOBA获取行

ccrfmcuu  于 2023-05-17  发布在  DB2
关注(0)|答案(2)|浏览(147)

输入表:

agent_id  transaction_code date       state_code
12345233      LARA         20230509      FL
12345233      LOBA         20230509      FL
45678342      LARA         20230509      AL
45678342      LOBA         20230509      AL
45678342      LOBA         20230509      AL
68939393      LOBA         20230509      AL
74953738      LOBA         20230509      GA
68939393      LARA         20230509      FL
68939393      LOBA         20230509      FL
68939393      LOBA         20230509      FL

预期输出表:

agent_id  transaction_code date       state_code
68939393      LOBA         20230509     AL
74953738      LOBA         20230509     GA

电流输出表:

agent_id  transaction_code date       state_code
12345233      LOBA         20230509      FL
45678342      LOBA         20230509      AL
45678342      LOBA         20230509      AL
68939393      LOBA         20230509      AL
74953738      LOBA         20230509      GA
68939393      LOBA         20230509      FL
68939393      LOBA         20230509      FL

我只希望输入表中有两行只有该代理ID的LOBA事务代码,而没有LARA事务代码,但是通过查询,我得到了所有的LOBA事务。

SELECT DISTINCT SUBSTR(A.RECORD_KEY,1,10) AS "PRODUCER_TAX_ID",
CASE WHEN B.SEX_CODE = 'E'THEN TRIM(B.CORPORATE_NAME) ELSE TRIM(B.FIRST_NAME) || TRIM(B.MIDDLE_NAME) || TRIM(B.LAST_NAME) END AS "PRODUCER_NAME",
SUBSTR(A.RECORD_KEY,11,2) AS "STATE_CODE", SUBSTR(A.RECORD_AREA,29,8) AS "APPOINTMENT_EFFECTIVE_DATE", A.ORIGINATOR_CD AS "USER_ID",
DECODE(A.FILE_MAINT_TRX_CD ,'LOBA','ADD') AS "TRANSACTION_TYPE",
SUBSTR(A.RECORD_AREA,134,1) AS "SEND_TO_STATE", A.LOG_DT_R AS "LAST_CHANGED_DT" , A.LOG_TIME AS "TIME_PROCESSED" 
FROM PPL_S01.REG_HIST A , PPL_S01.MPR B
WHERE SUBSTR(A.RECORD_KEY,1,10) NOT IN (select DISTINCT SUBSTR(A.RECORD_KEY,1,10)
from PPL_S01.REG_HIST R
where A.FILE_MAINT_TRX_CD = 'LARA' AND SUBSTR(R.RECORD_KEY,1,10) = SUBSTR(A.RECORD_KEY,1,10))
AND A.FILE_MAINT_TRX_CD = 'LOBA' 
AND B.MSTR_AGENT_ID = SUBSTR(A.RECORD_KEY,1,10)
s4chpxco

s4chpxco1#

我假设您正在尝试获取LOBA记录,而该记录中没有同一代理的LARA代码记录?如果是这种情况,则应执行以下操作:

SELECT IT1.*
FROM INPUT_TABLE IT1
WHERE IT1.TRANSACTION_CODE = 'LOBA'
AND NOT EXISTS (SELECT IT2.TRANSACTION_CODE
                FROM INPUT_TABLE IT2
                WHERE IT1.AGENT_ID = IT2.AGENT_ID
                AND IT2.TRANSACTION_CODE = 'LARA')
;
dgtucam1

dgtucam12#

您似乎想要只具有LOBA事务的代理行。如果是这样,你可以使用窗口函数来标记那些不满足要求的代理,然后过滤掉它们:

select *
from (
    select r.*,
        max(case when transaction_code <> 'LOBA' then 1 else 0 end) 
            over(partition by agent_id) flag
    from reg_hist r
) r
where flag = 0

相反,如果我们正在查找没有LARA事务的代理行,则需要将条件表达式更改为:

case when transaction_code = 'LARA' then 1 else 0 end

与使用子查询或连接的解决方案相反,窗口函数方法的结果是查询只扫描表一次,因此通常更有效。
PS:您当前的查询似乎与您的数据无关。

相关问题