В этой статье мы продолжим тему логической обработки запросов. В предыдущих материалах серии были рассмотрены табличные операторы JOIN, APPLY и PIVOT предложения FROM. На этот раз речь пойдет о четвертом и последнем табличном операторе предложения FROM — UNPIVOT.

В качестве тестовых данных будет использоваться та же база данных, TSQLV4, которая применялась в предыдущих статьях. Если она еще не установлена, вы можете загрузить программный код для ее создания и заполнения данными по адресу: http://tsql.solidq.com/SampleDatabases/TSQLV4.zip. Убедитесь, что установлен контекст для этой базы данных, прежде чем запускать примеры программного кода из статьи:

USE TSQLV4;

Наряду с описанием особенностей логической обработки оператора UNPIVOT я расскажу об альтернативе обратному транспонированию с использованием оператора APPLY. Кроме того, я приведу пример сочетания операторов UNPIVOT и PIVOT и поясню, как можно динамически выполнять обратное транспонирование данных.

Обратное транспонирование данных

При транспонировании данных происходит преобразование данных из строк в столбцы, а обратное транспонирование заключается в преобразовании данных из столбцов в строки. В качестве примера выполним программный код, чтобы построить таблицу с именем MyPivotedOrders и заполнить ее тестовыми данными (см. листинг 1). Содержимое MyPivotedOrders показано в таблице 1.

 

Содержимое таблицы Sales.MyPivotedOrders

 

В ходе операции обратного транспонирования обрабатывается любое число исходных столбцов, превышающее единицу. Они преобразуются в два целевых столбца, в одном из которых содержатся значения исходного столбца (values column), в другом — имена исходных столбцов (names column).

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

 

Результат задачи обратного транспонирования

 

Аналогично оператору PIVOT, T-SQL поддерживает оператор, именуемый UNPIVOT, который также используется в предложении FROM. Как и PIVOT, оператор UNPIVOT выполняет последовательность логических шагов. Я обозначаю шаги формулой 1-UN, где 1 отражает то обстоятельство, что предложение FROM представляет собой первое важное предложение, обрабатываемое логически, U — сокращение от UNPIVOT, а N — номер шага в операторе UNPIVOT.

Оператор UNPIVOT применяет три логических шага:

  • 1-U1. Создание копий.
  • 1-U2. Извлечение элемента.
  • 1-U3. Удаление значений NULL.

В следующих разделах показано применение этих шагов для нашей тестовой задачи.

1-U1. Создание копий

Первый шаг к обратному транспонированию данных заключается в формировании отдельного экземпляра каждой исходной строки для каждого столбца без транспонирования. Наши столбцы без транспонирования представляют годы заказов: 2014, 2015 и 2016, поэтому на данном шаге формируется копия для...

Это не вся статья. Полная версия доступна только подписчикам журнала. Пожалуйста, авторизуйтесь либо оформите подписку.
Купить номер с этой статьей в PDF