繁体   English   中英

连接来自多列的不同值

[英]Concatenate distinct values from multiple columns

我在桌子上有这个

party1 | party2
A      | E 
B      | D
C      | H
D      | B
E      | A
F      | H 
G      | I

我试图得到的结果是party1party2的不同串联,即

AE (will same as EA so only one instance is required)
BD (will same as DB so only one instance is required)
CH
FH
GI

Party1 和 Party2 是使用 CTE 形成的。 各方 AI 来自单表 Party,并使用代码 4 和 1 的业务逻辑标识为 party1 和 party2。

下面是我可以形成的查询

WITH CTE AS
(
      SELECT 
    DISTINCT CPR1.PARTY_IDENTIFIER AS PARTY1,
             CPR2.PARTY_IDENTIFIER AS PARTY2,
             CCR.CLIENT_RELATIONSHIP_TYPE_CODE,
             CPR1.CLIENT_TYPE_CODE
        FROM GOLD.CLIENT_TO_PARTY_RELATIONSHIP CPR1
        JOIN GOLD.CLIENT_TO_CLIENT_RELATIONSHIP CCR 
          ON     CPR1.CLIENT_IDENTIFIER = CCR.CLIENT_IDENTIFIER 
             AND CCR.CLIENT_RELATIONSHIP_TYPE_CODE = '04'
             AND CPR1.CLIENT_TYPE_CODE = '1'
        JOIN GOLD.CLIENT_TO_PARTY_RELATIONSHIP CPR2 
          ON CPR2.CLIENT_IDENTIFIER = CCR.CLIENT_IDENTIFIER
       WHERE (CPR1.PARTY_IDENTIFIER_INACTIVE_DATE IS NULL OR CPR1.PARTY_IDENTIFIER_INACTIVE_DATE ='')
         AND (CPR2.PARTY_IDENTIFIER_INACTIVE_DATE IS NULL OR CPR2.PARTY_IDENTIFIER_INACTIVE_DATE ='')
         AND CPR1.PARTY_IDENTIFIER<>CPR2.PARTY_IDENTIFIER
         AND CPR1.DATA_AS_OF_DATE LIKE '201912%' 
         AND CPR2.DATA_AS_OF_DATE LIKE '201912%'
         AND CCR.DATA_AS_OF_DATE LIKE '201912%'
)

  SELECT 
DISTINCT CONCAT("PG","_",TRIM(CAST(PARTY1 AS STRING)) ,"_",TRIM(CAST(PARTY1 AS STRING))) AS PG_KEY,
         party1,
         party2
    FROM CTE

您的描述说您实际上对串联不感兴趣,而是对由配对数据组成的(2 元素)集合感兴趣。 沿以下模板将它们(如您所做的那样)表示为 2 个字母的字符串 go。

WITH CTE AS
(
      SELECT CPR1.PARTY_IDENTIFIER AS PARTY1,
             CPR2.PARTY_IDENTIFIER AS PARTY2,
             CCR.CLIENT_RELATIONSHIP_TYPE_CODE,
             CPR1.CLIENT_TYPE_CODE
        FROM GOLD.CLIENT_TO_PARTY_RELATIONSHIP CPR1
        JOIN GOLD.CLIENT_TO_CLIENT_RELATIONSHIP CCR 
          ON     CPR1.CLIENT_IDENTIFIER = CCR.CLIENT_IDENTIFIER 
             AND CCR.CLIENT_RELATIONSHIP_TYPE_CODE = '04'
             AND CPR1.CLIENT_TYPE_CODE = '1'
        JOIN GOLD.CLIENT_TO_PARTY_RELATIONSHIP CPR2 
          ON CPR2.CLIENT_IDENTIFIER = CCR.CLIENT_IDENTIFIER
       WHERE (CPR1.PARTY_IDENTIFIER_INACTIVE_DATE IS NULL OR CPR1.PARTY_IDENTIFIER_INACTIVE_DATE ='')
         AND (CPR2.PARTY_IDENTIFIER_INACTIVE_DATE IS NULL OR CPR2.PARTY_IDENTIFIER_INACTIVE_DATE ='')
         AND CPR1.PARTY_IDENTIFIER<>CPR2.PARTY_IDENTIFIER
         AND CPR1.DATA_AS_OF_DATE LIKE '201912%' 
         AND CPR2.DATA_AS_OF_DATE LIKE '201912%'
         AND CCR.DATA_AS_OF_DATE LIKE '201912%'
)
  select
distinct CASE WHEN party1 < party2 
              THEN party1 || party2 
              ELSE party2 || party1
         END pair
         FROM CTE
       ;

注意事项

将 CTE 定义拉出子查询。 Concat 语法可能因您使用的 sql 方言/数据库产品而异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM