簡體   English   中英

PL SQL腳本根據列值進行連接

[英]PL SQL script to concatenate based on the column values

在編寫PL SQL腳本時我一度陷入困境。

我的要求是找到匹配的資產編號,將它們連接起來並插入基於邏輯的新表中。 這里的邏輯是根據密鑰查看是否存在匹配的資產編號。 如果沒有匹配的資產但密鑰相同,則連接所有資產。

這就是源表的樣子

KEY     PR_AST_NUM     SEC_AST_NUM

1-24N   1-2428         1-2428
1-24N   1-2428         1-3032
1-24N   1-2428         1-3032
1-28N   1-3032         1-3436
1-28N   1-3842         1-4042
1-28N   1-5054         1-7284

這就是目標表的外觀

KEY     CONCAT

1-24N   1-2428||1-2428
1-24N   1-2428||1-3032
1-28N   1-3032||1-3436||1-3842||1-4042||1-5054||1-7284

為了實現這一點,我首先編寫了以下代碼。 但它並沒有連接與密鑰匹配的所有記錄。 你能幫我修改代碼嗎?

DECLARE

    K VARCHAR2(30);
    NK VARCHAR2(30);
    PST  VARCHAR2(30);
    NPST VARCHAR2(30);
    AST VARCHAR2(30);
    NAST VARCHAR2(30);

    M INTEGER(20) := 1;

    CURSOR PRDT IS 

    SELECT DISTINCT KEY,
           LEAD(KEY) OVER (ORDER BY KEY) AS NXTKEY,
           PR_AST_NUM,
           LEAD(PR_AST_NUM) OVER (ORDER BY KEY) AS NXTPRAST,
           SEC_AST_NUM,
           LEAD(SEC_AST_NUM) OVER (ORDER BY KEY) AS NXTSECAST
    FROM  DET_SRC
    ORDER BY KEY;

    BEGIN

    OPEN PRDT;

    LOOP

    FETCH PRDT INTO K, NK, PST, NPST, AST, NAST;

    EXIT WHEN PRDT%NOTFOUND;

    IF ((K = NK) AND (PST = NPST) AND (AST = NAST))
    THEN

    INSERT INTO DET_MOD
    VALUES (K, PST||'||'||AST);

    M := M + 1;

    ELSIF ((K = NK) AND (PST = NPST) AND (AST <> NAST))
    THEN

    M := 1;

    INSERT INTO DET_MOD
    VALUES (K, PST||'||'||AST);

    ELSIF ((K = NK) AND (PST <> NPST) AND (AST <> NAST))
    THEN

    INSERT INTO DET_MOD
    VALUES (K, PST||'||'||AST);

    M := 1;

    END IF;

    END LOOP;

    COMMIT;

    CLOSE PRDT;

    END;

這是代碼的輸出。 如您所見,它不是連接到下一行,而是創建一個新行並忽略最后一個條件。

    KEY     CONCAT
    1-24N   1-2428||1-2428
    1-24N   1-2428||1-3032
    1-28N   1-3032||1-3436
    1-28N   1-3842||1-4042

謝謝 !

查看本次現場演示

在游標或函數或任何其他代碼中使用以下查詢來獲取結果。

代碼:

            select KEY, LISTAGG(AST_NUM, '||') WITHIN GROUP (ORDER BY KEY) 
            as CONCAT_ASSET_NUM
            from 
            (select   distinct KEY ,  Concat(PR_AST_NUM , Concat('||',SEC_AST_NUM))  
            as AST_NUM
            from DET
            where PR_AST_NUM=SEC_AST_NUM
            Order by KEY 

            )b 
            group by KEY


            union all

            select KEY, LISTAGG(AST_NUM, '||') WITHIN GROUP (ORDER BY KEY) 
            as CONCAT_ASSET_NUM
            from 
            (select   distinct KEY ,  Concat(PR_AST_NUM , Concat('||',SEC_AST_NUM))  
            as AST_NUM
            from DET
            where PR_AST_NUM!=SEC_AST_NUM
            Order by KEY 

            )a 
            group by KEY

輸出:

在此輸入圖像描述

你能試試這個:

SELECT val1, LISTAGG(val2, ', ') WITHIN GROUP (ORDER BY val2) AS value2
from (
    select KEY as val1, PR_AST_NUM as val2 from myTable 
    union all     
    select key, SEC_AST_NUM from myTable) t group by val1

這將為您提供所需的結果

select      key
           ,listagg (PR_AST_NUM || '||' || SEC_AST_NUM,'||') 
                within group (order by PR_AST_NUM) as concat

from       (select      distinct
                        key,PR_AST_NUM,SEC_AST_NUM

            from        mytable                 
            ) 

group by    key
           ,case when PR_AST_NUM = SEC_AST_NUM then PR_AST_NUM end

+-------+------------------------------------------------+
| KEY   | CONCAT                                         |
+-------+------------------------------------------------+
| 1-24N | 1-2428||1-3032                                 |
+-------+------------------------------------------------+
| 1-24N | 1-2428||1-2428                                 |
+-------+------------------------------------------------+
| 1-28N | 1-3032||1-3436||1-3842||1-4042||1-5054||1-7284 |
+-------+------------------------------------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM