[英]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.