簡體   English   中英

行值顯示在單獨的列中

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

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