Уменьшить 19 столбцов до 5 столбцов

#sql #oracle

#sql #Oracle

Вопрос:

У меня проблема. Мне нужна помощь!

Итак, я на Sqldeveloper / Oracle. У меня 19 столбцов, и я хочу уменьшить его до 5 столбцов, но не всегда есть 5 полей. Это возможно? Например, у меня есть это :

введите описание изображения здесь

с помощью этого кода :

  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';
  

Я хочу, чтобы это было с 5 столбцами, подобными этому

введите описание изображения здесь

У вас есть решение?

Комментарии:

1. вам всегда нужны одни и те же 5 столбцов?

2. используйте функцию объединения и выведите 5 столбцов

3. Какую версию базы данных Oracle вы используете?

4. Я был бы против создания таких операторов case и использовал бы справочную таблицу, которая содержала бы значения, которые вы сравниваете в операторе case

5. — Да, я хотел бы те же 5 столбцов — Объединение было бы хорошо, я думаю (я никогда не использовал его), но использует несколько столбцов из одной таблицы — Моя версия базы данных Oracle — версия 19.2.1.247 — И я, к сожалению, не могу создать новую таблицу

Ответ №1:

То, что вы ищете, — это простая PIVOT функция.

Единственное отличие заключается в том, что вы не хотите pivot указывать значение столбца, но возможно в порядке ключевых слов.

Здесь запрос для поворота в алфавитном порядке ключевых слов.

Обратите внимание, что первые два подзапроса выдают только упрощенные данные следующим образом:

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

Запрос сначала вычисляет номер строки, используя порядок CODRCA и pivot на нем:

 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"))
  

Результат

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

Если вы предпочитаете другую логику сортировки, адаптируйте ее по мере необходимости.
Также адаптируйтесь, если вам нужны разные имена столбцов.

Ответ №2:

Вы можете использовать запрос, подобный приведенному ниже, чтобы объединить отдельный список значений CODRCA в список, разделенный запятыми, а затем разделить список на 5 разных столбцов. Вы также можете добавить упорядочение в список, если хотите.

 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);
  

Комментарии:

1. Ваш код точен большое вам спасибо! Но у меня есть код, и я не говорю, как интегрировать ваш код с моим

2. Без более четкого описания того, что представляет собой ваш существующий код, я не могу вам помочь. Если вам нужна помощь в этом, ее следует задать в отдельном вопросе, поскольку этот запрос отвечает на заданный вопрос.