Логическая обработка запросов: сочетание операторов
Содержание:
1. Введение;
2. 1-U1, 1-U2, 1-U3;
3. Альтернативное решение с использованием APPLY;
4. Сочетание операторов (Вы читаете данный раздел).
Помните, что вы можете сочетать табличные операторы в предложении FROM. С точки зрения логической обработки запросов они обрабатываются слева направо в том порядке, в котором записаны. Это означает, что результаты одного оператора становятся входными данными для следующего. Например, предположим, что требуется транспонировать данные из таблицы Sales.МуPivotedOrders, и, вместо того чтобы показать сотрудников в строках, а годы заказов в столбцах, вы хотите возвратить годы заказов в строках, а идентификаторы сотрудников — в столбцах. В таблице ниже показаны необходимые выходные данные.
Чтобы этого добиться, нужно сначала выполнить обратное транспонирование данных, чтобы создать результат с одной строкой для сотрудника и года заказа, а затем свести результат, чтобы создать строку для года заказа и столбец для сотрудника, например, как в коде выше.
В предыдущей статье было показано, как использовать метод на основе параметра FOR XML, чтобы построить запрос PIVOT и выполнить его динамически, избегая жесткого распределения значений. Очень похожим способом можно выполнить задачу динамического обратного транспонирования. В нашем примере с таблицей N’Sales.MyPivotedOrders вы можете получить имена столбцов, для которых нужно выполнить обратное транспонирование путем запроса к представлению sys.columns. Вы можете выбрать все столбцы, кроме столбца empid. В остальном все происходит так же, как было показано в задаче динамического транспонирования. Метод FOR XML используется для создания списка имен столбцов с разделительными запятыми, который должен появиться в предложении IN оператора UNPIVOT и конкатенации статических частей запроса перед списком столбцов и после него. Наконец используется хранимая процедура sp_execntesql для запуска кода.
В коде выше приводится полный программный код решения.
Итак, в этой статье я остановился на логической обработке запросов табличного оператора UNPIVOT. Были описаны три этапа работы оператора: создание копий, извлечение элемента и удаление значений NULL; представлены синтаксис оператора и рекомендации, как запомнить элементы этого синтаксиса. Мы рассмотрели недостатки оператора, альтернативное решение с использованием оператора APPLY, сочетание операторов PIVOT и UNPIVOT и, наконец, динамическое обратное транспонирование.
1. Введение;
2. 1-U1, 1-U2, 1-U3;
3. Альтернативное решение с использованием APPLY;
4.
Помните, что вы можете сочетать табличные операторы в предложении FROM. С точки зрения логической обработки запросов они обрабатываются слева направо в том порядке, в котором записаны. Это означает, что результаты одного оператора становятся входными данными для следующего. Например, предположим, что требуется транспонировать данные из таблицы Sales.МуPivotedOrders, и, вместо того чтобы показать сотрудников в строках, а годы заказов в столбцах, вы хотите возвратить годы заказов в строках, а идентификаторы сотрудников — в столбцах. В таблице ниже показаны необходимые выходные данные.
Чтобы этого добиться, нужно сначала выполнить обратное транспонирование данных, чтобы создать результат с одной строкой для сотрудника и года заказа, а затем свести результат, чтобы создать строку для года заказа и столбец для сотрудника, например, как в коде выше.
Динамическая операция UNPIVOT
В предыдущей статье было показано, как использовать метод на основе параметра FOR XML, чтобы построить запрос PIVOT и выполнить его динамически, избегая жесткого распределения значений. Очень похожим способом можно выполнить задачу динамического обратного транспонирования. В нашем примере с таблицей N’Sales.MyPivotedOrders вы можете получить имена столбцов, для которых нужно выполнить обратное транспонирование путем запроса к представлению sys.columns. Вы можете выбрать все столбцы, кроме столбца empid. В остальном все происходит так же, как было показано в задаче динамического транспонирования. Метод FOR XML используется для создания списка имен столбцов с разделительными запятыми, который должен появиться в предложении IN оператора UNPIVOT и конкатенации статических частей запроса перед списком столбцов и после него. Наконец используется хранимая процедура sp_execntesql для запуска кода.
В коде выше приводится полный программный код решения.
Итак, в этой статье я остановился на логической обработке запросов табличного оператора UNPIVOT. Были описаны три этапа работы оператора: создание копий, извлечение элемента и удаление значений NULL; представлены синтаксис оператора и рекомендации, как запомнить элементы этого синтаксиса. Мы рассмотрели недостатки оператора, альтернативное решение с использованием оператора APPLY, сочетание операторов PIVOT и UNPIVOT и, наконец, динамическое обратное транспонирование.