Giảm 19 cột xuống 5 cột
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
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);
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.