Поиск по этому блогу

Конструктор запросов и функция PIVOT

Предположим, у вас имеется база данных из нескольких таблиц. Например, такая, как предложено в предыдущей статье.

Простое представление

Предположим, мы хотим вывести список пользователей, упорядоченный по алфавиту.
Для создания представления выберите в меню SQL Workshop / Object Browser и нажмите кнопку + // View у правой границы окна. APEX начинает диалог, в ходе которого введите имя представления и нажмите кнопку Query Builder, которая открывает режим конструктора запроса (рисунок 1).

Рисунок 1 – окно построителя запросов
Слева можно выбирать нужные таблицы (одинарный щелчок мышью), вверху – отмечать требуемые поля, в нижней части – описывать условия отбора, сортировку, группировку данных, переименовать поля.
Там же можно просмотреть и редактировать код SQL, а также увидеть результат выполнения запроса.  Нажав кнопку Return, вы получите сгенерированный код представления.
После сохранения вновь созданное представление появится в списке объектов View и будет доступно для просмотра и изменения.
После каждого изменения вьюшки требуется заново компилировать: для этого не забывайте нажимать кнопку Save and Compile (в режиме кода).
Теперь вы можете использовать его как источник данных для формы или отчета в веб-приложении.

Перекрестный запрос

Перекрестный запрос в APEX сильно отличается от соответствующей команды Access: здесь нет расширения SQL - команды TRANSFORM, однако имеется специальная функция PIVOT, которая позволяет развернуть сгруппированные расчетные показатели в удобную для просмотра таблицу.
Допустим, у Вас есть таблица или представление Продажи, состоящее  из трех столбцов:
Год
Колич
Товар
2009
5
Монитор
2010
3
Принтер
2011
4
Сканер
2009
5
Принтер
2010
8
Сканер
2011
6
Монитор
2009
5
Сканер
2010
4
Монитор
2011
7
Принтер
При увеличении количества товаров и лет эта таблица быстро вытягивается в высоту и становится не удобной для анализа. А если упорядочить годы и развернуть их список по ширине таблицы, то те же данные предстанут в более наглядном и компактном виде:
Товар
2009
2010
2011
Сканер
5
8
4
Монитор
5
4
6
Принтер
5
3
7

Как раз для этого и служит предложение PIVOT в команде SELECT:

select * from
(  select год, колич, товар  from Продажи )
pivot (sum(колич)
for год in (2009, 2010,2011) ) ;

Недостатком по сравнению с ACCESS является то, что данные в списке FOR ... IN надо перечислить явно, во время разработки запроса. Значит, с течением времени, когда в БД окажется информация за другие временные периоды, придется переписывать этот запрос.  Но можете сразу перечислить все года вперед на предполагаемое время жизни вашего приложения.

Упражнение.
Создайте представления:
  •  «Выручка по торговым точкам (перекрестный)», 
  • «Остатки товаров по торговым точкам (меньше 10 на последний день)». 
Сохраните код SQL и скриншот результата в отчете о лабораторной работе.

Примеры этих запросов в Access приведены на рисунках 2 и 3:

Выручка по торгТочкам_перекрестный
Дата
Итого
автовокзал
Парк Белинского
тц Арбат
Центральный рынок
01.07.2015
9 500,00р.
5 500,00р.
4 000,00р.
02.07.2015
11 500,00р.
6 500,00р.
5 000,00р.
03.07.2015
10 500,00р.
7 800,00р.
2 700,00р.
ИТОГ:
31 500,00р.
6 500,00р.
13 300,00р.
5 000,00р.
6 700,00р.
Перекрестный запрос «Выручка по торговым точкам» и его результат
Рисунок 2 - Перекрестный запрос «Выручка по торговым точкам" и его результат


ОстаткиМеньше10
Дата
Место
Товар
Остаток
03.07.2015
Парк Белинского
Попкорн
2
03.07.2015
Парк Белинского
Шар на палке
3
03.07.2015
Центральный рынок
Сувенир
5
02.07.2015
тц Арбат
Лимонад
7
01.07.2015
Парк Белинского
Попкорн
1

Рисунок 3  - Запрос "Остатки товара по торговым точкам (меньше 10 единиц)" и его результат