[英]Row Values To Appear In Separate Columns
我有以下數據
create table company (com_cd varchar2(100), act_id number(10));
insert into company values ('IBM',100);
insert into company values ('IBM',200);
insert into company values ('IBM',300);
insert into company values ('HP',50);
insert into company values ('HP',85);
然后我運行了這個查詢
select COM_CD,
REGEXP_SUBSTR(DUP_ACT_ID,'[^,]+',1,1) AS DUP_ACT_1,
REGEXP_SUBSTR(DUP_ACT_ID,'[^,]+',1,2) AS DUP_ACT_2,
REGEXP_SUBSTR(DUP_ACT_ID,'[^,]+',1,3) AS DUP_ACT_3
FROM (
SELECT COM_CD, LISTAGG(ACT_ID,',') DUP_ACT_ID
FROM COMPANY
GROUP BY COM_CD HAVING COUNT(*) > 1
);
COM_CD DUP_ACT_1 DUP_ACT_2 DUP_ACT_3
HP 50 85
IBM 100 200 300
它給了我正確的 output 但我不知道在包含數千個值的表中是否會有 1 個或 10 個重復的 ACT_ID。 所以我正在尋找一種解決方案,我不使用 regexp_substr 而是根據 DUP_ACT_ID 列中的值數量以某種方式獲取 output 。 任何幫助表示贊賞。
如果您不必為每個 com_cd 設置一行,則可以使用以下內容:
SELECT com_cd,seq,act_id dup_act_id from
(select distinct com_cd,act_id,
dense_rank() over (partition by com_cd order by act_id) seq,
count(distinct act_id) over (partition by com_cd) cnt
from company)
where cnt > 1
order by com_cd,seq
COM_CD SEQ DUP_ACT_ID
HP 1 50
HP 2 85
IBM 1 100
IBM 2 200
IBM 3 300
您沒有提到如果我們在 com_cd 中多次看到相同的 act_id 會發生什么,我假設您只想看到一次。
如果您需要為每個 dup_act_id 創建一個新列,您可以使用上述查詢 pivot:
WITH dup_accts as (SELECT com_cd,seq,act_id dup_act_id from
(select distinct com_cd,act_id,
dense_rank() over (partition by com_cd order by act_id) seq,
count(distinct act_id) over (partition by com_cd) cnt
from company)
where cnt > 1)
select * from dup_accts pivot(max(dup_act_id) for seq in (1 dup_act_1,2 dup_act_2,3 dup_act_3))
COM_CD DUP_ACT_1 DUP_ACT_2 DUP_ACT_3
IBM 100 200 300
HP 50 85
但在這種情況下,您仍然需要為每個額外的 dup_act_id 在 in() 子句中添加一個新部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.