#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. Без более четкого описания того, что представляет собой ваш существующий код, я не могу вам помочь. Если вам нужна помощь в этом, ее следует задать в отдельном вопросе, поскольку этот запрос отвечает на заданный вопрос.