Giảm 19 cột xuống 5 cột

Oct 27 2020

Tôi có một vấn đề. Tôi cần giúp đỡ!

Vì vậy, tôi đang sử dụng Sqldeveloper / Oracle. Tôi có 19 cột và tôi muốn giảm nó xuống 5 cột, nhưng không phải lúc nào cũng có 5 trường. Nó có thể? Ví dụ tôi có cái này:

với mã này:

 SELECT distinct PRO.CODPRO, 
        CASE RCA.CODRCA WHEN 'LOGIST' THEN RCA.CODRCA END  AS IndustriesConcerned1,
        CASE RCA.CODRCA WHEN 'LEGSEC' THEN RCA.CODRCA END  AS IndustriesConcerned2,
        CASE RCA.CODRCA WHEN 'AGRICU' THEN RCA.CODRCA END  AS IndustriesConcerned3,
        CASE RCA.CODRCA WHEN 'AGROAL' THEN RCA.CODRCA END  AS IndustriesConcerned4,
        CASE RCA.CODRCA WHEN 'ARTAUU' THEN RCA.CODRCA END  AS IndustriesConcerned5,
        CASE RCA.CODRCA WHEN 'ENTRET' THEN RCA.CODRCA END  AS IndustriesConcerned7,
        CASE RCA.CODRCA WHEN 'ESPVER' THEN RCA.CODRCA END  AS IndustriesConcerned8,
        CASE RCA.CODRCA WHEN 'GROEUV' THEN RCA.CODRCA END  AS IndustriesConcerned9,
        CASE RCA.CODRCA WHEN 'INDCHI' THEN RCA.CODRCA END  AS IndustriesConcerned10,
        CASE RCA.CODRCA WHEN 'INDLEG' THEN RCA.CODRCA END  AS IndustriesConcerned11,
        CASE RCA.CODRCA WHEN 'INDLOU' THEN RCA.CODRCA END  AS IndustriesConcerned12,
        CASE RCA.CODRCA WHEN 'LEGHUM' THEN RCA.CODRCA END  AS IndustriesConcerned13,
        CASE RCA.CODRCA WHEN 'LOUHUM' THEN RCA.CODRCA END  AS IndustriesConcerned14,
        CASE RCA.CODRCA WHEN 'LOUSEC' THEN RCA.CODRCA END  AS IndustriesConcerned15,
        CASE RCA.CODRCA WHEN 'MARICU' THEN RCA.CODRCA END  AS IndustriesConcerned16,
        CASE RCA.CODRCA WHEN 'SECEUV' THEN RCA.CODRCA END  AS IndustriesConcerned17,
        CASE RCA.CODRCA WHEN 'TP' THEN RCA.CODRCA END  AS IndustriesConcerned18,
        CASE RCA.CODRCA WHEN 'TRANSP' THEN RCA.CODRCA END  AS IndustriesConcerned19
        FROM PRO JOIN PRB ON PRO.MOTCLE=PRB.CODPRO JOIN RCA ON PRB.codrca=RCA.codrca where RCA.typrca='UTI' AND RCA.CODRCA<>'LEGSEC' AND RCA.CODRCA<>'LOUSEC' AND RCA.CODRCA<>'LEGHUM' AND RCA.CODRCA<>'LOUHUM';

Tôi muốn cái này có 5 cột như thế này

Bạn đã có một giải pháp?

Trả lời

EJEgyed Oct 27 2020 at 13:41

Bạn có thể sử dụng truy vấn như bên dưới để nối danh sách các giá trị CODRCA riêng biệt vào một danh sách được phân tách bằng dấu phẩy, sau đó chia danh sách thành 5 cột khác nhau. Bạn cũng có thể thêm thứ tự vào LISTAGG nếu bạn muốn.

select codpro,
       regexp_substr(codrca_list, '[^,]+',1,1) as IndustriesConcerned1,
       regexp_substr(codrca_list, '[^,]+',1,2) as IndustriesConcerned2,
       regexp_substr(codrca_list, '[^,]+',1,3) as IndustriesConcerned3,
       regexp_substr(codrca_list, '[^,]+',1,4) as IndustriesConcerned4,
       regexp_substr(codrca_list, '[^,]+',1,5) as IndustriesConcerned5
 from (
  SELECT CODPRO, LISTAGG (CODRCA, ',') as codrca_list
    FROM (SELECT DISTINCT PRO.CODPRO, RCA.CODRCA
            FROM PRO
                 JOIN PRB ON PRO.MOTCLE = PRB.CODPRO
                 JOIN RCA ON PRB.codrca = RCA.codrca
           WHERE     RCA.typrca = 'UTI'
                 AND RCA.CODRCA <> 'LEGSEC'
                 AND RCA.CODRCA <> 'LOUSEC'
                 AND RCA.CODRCA <> 'LEGHUM'
                 AND RCA.CODRCA <> 'LOUHUM')
GROUP BY codpro);
MarmiteBomber Oct 27 2020 at 14:39

Những gì bạn đang tìm kiếm một PIVOTtính năng đơn giản .

Sự khác biệt duy nhất là bạn không muốn pivottrên giá trị cột , nhưng có thể trên thứ tự từ khóa .

Đây là truy vấn để xoay vòng theo thứ tự bảng chữ cái của các từ khóa.

Lưu ý rằng hai truy vấn con đầu tiên chỉ tạo ra dữ liệu đơn giản như sau:

CODPRO  CODRCA
------- ------
400JE   LOGIST
400JE   INDLEG
50EFJ10 TP    
50EFJ10 ESPVER
50EFJ10 AGRICU
50EFJ10 INDLEG
50EFJ10 LOGIST

Truy vấn tính toán đầu tiên số hàng bằng cách sử dụng thứ tự của CODRCAvà pivottrên đó:

with PRO as (
select '400JE' CODPRO from dual union all
select '50EFJ10' CODPRO from dual),
RCA as (
select '400JE' CODPRO, 'LOGIST' CODRCA from dual union all
select '400JE' CODPRO, 'INDLEG' CODRCA from dual union all
select '50EFJ10' CODPRO, 'TP' CODRCA from dual union all
select '50EFJ10' CODPRO, 'ESPVER' CODRCA from dual union all
select '50EFJ10' CODPRO, 'AGRICU' CODRCA from dual union all
select '50EFJ10' CODPRO, 'INDLEG' CODRCA from dual union all
select '50EFJ10' CODPRO, 'LOGIST' CODRCA from dual),
rn as (
select PRO.CODPRO,RCA.CODRCA,
row_number() over (partition by PRO.CODPRO order by RCA.CODRCA) as rn
from PRO
join RCA on PRO.CODPRO = RCA.CODPRO)
select *
from rn
pivot (max(CODRCA)  CODRCA for (rn) in
(1 as "C1",
 2 as "C2",
 3 as "C3",
 4 as "C4",
 5 as "C5"))

kết quả

CODPRO  C1_COD C2_COD C3_COD C4_COD C5_COD
------- ------ ------ ------ ------ ------
400JE   INDLEG LOGIST                     
50EFJ10 AGRICU ESPVER INDLEG LOGIST TP

Nếu bạn thích phân loại khác logik thích ứng theo yêu cầu. Cũng thích ứng nếu bạn cần các tên cột khác nhau.