#sql #oracle #automation #pivot
#sql #Oracle #автоматизация #свод
Вопрос:
Это что-то простое, и я гарантирую, что я слишком много думаю. У меня есть набор входных данных с ежемесячными данными, которые выглядят следующим образом:
MTD | ID | State
-----------------------
Jan-16 | 1 | A
Feb-16 | 1 | B
Mar-16 | 1 | A
Jan-16 | 2 | C
Feb-16 | 2 | B
Mar-16 | 2 | A
MTD — это поле даты, и каждый месяц представлен первым числом этого месяца (например, апрель 2016 = 01-апрель-16).
Мне нужно написать запрос, который возвращает:
ID | Jan State | Feb State | Mar State | (Repeat for each month)
------------------------------------------------------------------------
1 | A | B | A | ...
2 | C | B | A | ...
Поскольку новые данные добавляются каждый месяц, я хочу автоматизировать запрос, чтобы мне не приходилось редактировать его, когда выходит новый месяц данных.
Возможно ли то, что я пытаюсь сделать?
Комментарии:
1. что вы подразумеваете под автоматизацией в этом контексте?
2. Если количество строк в исходной таблице (и, следовательно, количество столбцов в результате) меняется от одного выполнения к другому, вы не можете сделать это с помощью стандартного SQL. Вам понадобится «динамический SQL» (то, что большинство профессионалов не рекомендуют), или, что лучше всего, вы можете получить отчет в любом формате, который вам нужен, если вы используете надлежащие специализированные инструменты ОТЧЕТНОСТИ,
3. @vkp — «Автоматизация» означает, что запрос будет смотреть на столбец «MTD» входных данных, чтобы определить, сколько столбцов нужно добавить. Таким образом, при добавлении данных за новый месяц запрос добавит новый столбец без необходимости редактирования.
4. @mathguy — Спасибо, это та информация, которую я искал. Последующий вопрос: если бы я выполнил это упражнение и согласился хранить данные только за один год, стал ли запрос возможным, даже если у меня нет данных за все 12 месяцев? Например, скажем, я хотел включить данные за 2016 год. У меня есть данные с января по октябрь, но мне не хватает ноября и декабря. Можно ли написать запрос так, чтобы в столбцах Nov и Dec отображались нули, пока во входных данных не появятся данные?
5. Да, это возможно. Если ваша версия Oracle 11.1 или выше, вы можете сделать это с помощью оператора PIVOT; в противном случае вы можете сделать то же самое «вручную».
Ответ №1:
Смотрите Комментарии к исходному вопросу — ОП указал, что он будет доволен решением для известного набора значений в столбце MTD.
Демонстрация (при условии, что значения в столбце MTD известны заранее):
with
inputs ( mtd, id, state ) as (
select 'Jan-16', 1, 'A' from dual union all
select 'Feb-16', 1, 'B' from dual union all
select 'Mar-16', 1, 'A' from dual union all
select 'Jan-16', 2, 'C' from dual union all
select 'Feb-16', 2, 'B' from dual union all
select 'Mar-16', 2, 'A' from dual
)
select *
from inputs
pivot (max(state) for mtd in ('Jan-16' as jan_state, 'Feb-16' as feb_state,
'Mar-16' as mar_state))
;
Вывод:
ID JAN_STATE FEB_STATE MAR_STATE
--- -------- --------- ---------
1 A B A
2 C B A