簡體   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