Excel сводные таблицы наборы

При работе с интерактивной аналитической OLAP сводной таблицей в Excel можно создавать именованные наборы, гибкие функции, которые можно использовать для:

  • Группирование общих наборов элементов, которые можно использовать повторно, даже если эти наборы не присутствуют в данных.

  • Объедините элементы из разных иерархий способами, которые были недоступны в более ранних версиях Excel, которые часто называют асимметричными отчетами.

  • Создайте именованный набор с помощью пользовательских многомерных выражений (MDX), языка запросов для баз данных OLAP, который предоставляет синтаксис вычислений, аналогичный формулам листа.

Если вы не знакомы с языком запросов многомерных выражений (MDX), можно создать именованный набор на основе элементов в строках или столбцах сводной таблицы. Дополнительные сведения о языке запросов многомерных выражений см. в статье «Запрос многомерных данных».

Если вы знакомы с языком запросов многомерных выражений, можно использовать многомерные выражения для создания или изменения именованного набора.

В этой статье

  • Создание именованного набора на основе элементов строк или столбцов

  • Создание именованного набора с помощью многомерных выражений

  • Изменение или удаление именованного набора

Создание именованного набора на основе элементов строк или столбцов

  1. Щелкните сводную таблицу OLAP, для которой нужно создать именованный набор.

    Откроется окно «Инструменты сводной таблицы» с добавлением вкладок «Параметры » и «Конструктор «.

  2. На вкладке «Параметры» в группе «Вычисления» щелкните «Поля», «Элементы», «Наборы &«, а затем выберите команду «Создать набор на основе элементов строк» или «Создать набор на основе элементов столбцов».

    ''Работа со сводными таблицами'': группа ''Вычисления'' на вкладке ''Параметры''

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

  3. В поле «Задать имя » введите имя, которое вы хотите использовать для набора.

  4. Чтобы указать строки, которые необходимо включить в именованный набор, выполните одно или несколько из следующих действий:

    • Чтобы удалить строку из списка элементов, щелкните область слева от нужной строки и нажмите кнопку «Удалить строку».

    • Чтобы добавить новую строку в список элементов, щелкните область слева от строки, под которой нужно добавить новую строку, а затем нажмите кнопку «Добавить строку».

    • Чтобы создать копию элемента, щелкните область слева от строки, которую нужно скопировать, а затем нажмите кнопку «Копировать строку».

    • Чтобы переместить элемент в другое место, щелкните область слева от строки, которую вы хотите переместить, а затем с помощью стрелок вверх и вниз переместите его в соответствующее расположение.

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

    • Чтобы отобразить эти элементы в том же поле, что и другие элементы, снимите флажок «Отображаемые элементы с разных уровней » в отдельных полях .

    • Чтобы текущие поля отображались в области строк или столбцов, снимите флажок «Заменить поля в области строк» новым набором или замените поля в области столбцов новым флажком. Набор не будет отображаться в сводной таблице при нажатии кнопки «ОК», но будет доступен в списке полей сводной таблицы.

  6. Нажмите кнопку « ОК», чтобы создать именованный набор.

    Примечания: 

    • Чтобы отменить все действия после закрытия диалогового окна, нажмите кнопку «Отменить» на панели быстрого доступа.

    • К именованным наборам нельзя применить фильтрацию любого типа.

К началу страницы

Создание именованного набора с помощью многомерных выражений

Важно: При использовании многомерных выражений для создания именованного набора или изменения определения многомерных выражений существующего именованного набора любые дополнительные изменения можно выполнить только с помощью многомерных выражений.

  1. Щелкните сводную таблицу OLAP, для которой нужно создать пользовательский именованный набор.

  2. На вкладке «Параметры» в группе «Вычисления» щелкните «Поля», «Элементы», «& Наборы«, а затем выберите пункт «Управление наборами».

    ''Работа со сводными таблицами'': группа ''Вычисления'' на вкладке ''Параметры''

    Отобразится диалоговое окно «Диспетчер наборов». При необходимости можно изменить размер этого диалогового окна, перетащив маркер изменения размера в правом нижнем углу диалогового окна.

  3. Нажмите кнопку «Создать», а затем нажмите кнопку «Создать набор» с помощью многомерных выражений.

  4. В поле «Задать имя » введите имя, которое вы хотите использовать для набора.

  5. Чтобы задать определение многомерных выражений для именованного набора, выполните одно из следующих действий:

    • В поле «Задать определение » введите или вставьте скопированное определение многомерных выражений.

    • На вкладке «Поля и элементы » выберите запись списка полей, которую нужно включить, и нажмите кнопку «Вставить».

      Вы также можете перетащить запись списка полей в поле определения «Задать» или дважды щелкнуть запись списка полей.

      Доступные записи списка полей

      Запись списка полей

      Примеры многомерных выражений, созданных с помощью куба Adventure Works

      измерение

      [Продукт]

      Иерархия атрибутов (включает все элементы)

      [Продукт]. [Категория]

      Уровень иерархии атрибутов (не включает все члены)

      [Продукт]. [Категория]. [Категория]

      Элемент из иерархии атрибутов

      [Продукт]. [Категория].&[4]

      Иерархия пользователей

      [Продукт]. [Категории продуктов]

      Уровень иерархии пользователей

      [Продукт]. [Категории продуктов]. [Категория]

      Элемент из пользовательской иерархии

      [Продукт]. [Категории продуктов]. [Категория].&[4]

      Измерения

      [Меры]. [Интернет-объем продаж]

      Вычисляемая мера

      [Меры]. [Отношение интернета к родительскому продукту]

      Именованный набор

      [Основная группа продуктов]

      Значение ключевого показателя эффективности

      KPIValue («Коэффициент валовой прибыли продукта)

      Цель ключевого показателя эффективности

      KPIGoal(«Product Gross Profit Margin»),

      Состояние ключевого показателя эффективности

      KPIStatus («Валовая прибыль продукта»)

      Тренд ключевого показателя эффективности

      KPITrend(«Валовая прибыль продукта»)

      Свойство member из пользовательской иерархии

      [Продукт]. [Категории продуктов]. Properties(«Class»)

      Свойство member из иерархии атрибутов

      [Продукт]. [Продукт]. Properties(«Class»)

    • На вкладке « Функции» выберите одну или несколько функций из доступных функций многомерных выражений, которые вы хотите использовать, и нажмите кнопку «Вставить». Функции многомерных выражений поддерживаются службами Analysis Services. они не включают функции VBA.

      Аргументы функции помещаются внутри символов шеврона (<< >>). Вы можете заменить аргументы заполнителей, щелкнув их, а затем введя допустимые имена, которые вы хотите использовать.

      Примеры функций многомерных выражений

      ADDCALCULATEDMEMBERS( «Set» )
      AGGREGATE( «Set»[, «Numeric Expression»] )
      «Level»ALLMEMBERS
      «Hierarchy» (Иерархия).ALLMEMBERS
      ANCESTOR( «Member» «Level» )
      ANCESTOR( «Member», «Distance» )
      ANCESTORS( «Member», «Distance» )
      ANCESTORS( «Member», «Level» )
      ASCENDANTS( «Member» )
      AVG( «Set»[, «Числовое выражение»] )
      AXIS( «Числовое выражение» )
      BOTTOMNCOUNT( «Set», «Count»[, «Numeric Expression»] )
      BOTTOMPERCENT( «Set», «Percentage», «Numeric Expression» )
      BOTTOMSUM ( «Set», «Value», «Numeric Expression» ) …

  6. Чтобы протестировать новое определение многомерных выражений, щелкните «Тест многомерных выражений».

  7. По умолчанию элементы из разных уровней будут отображаться в отдельных полях в иерархии, поля упорядочивания и повторяющиеся записи автоматически удаляются (так как в набор добавлены HIERARCHIZE и DISTINCT), а именованный набор заменяет текущие поля в строке или области столбца.

    • Чтобы отобразить эти элементы в том же поле, что и другие элементы, снимите флажок «Отображаемые элементы с разных уровней » в отдельных полях .

    • Чтобы изменить иерархию по умолчанию и сохранить повторяющиеся записи, снимите автоматический порядок и удалите дубликаты из установленного флажка.

    • Чтобы текущие поля отображались в области строк или столбцов, снимите флажок «Заменить поля в области строк» новым набором или замените поля в области столбцов новым флажком. Набор не будет отображаться в сводной таблице при нажатии кнопки «ОК», но будет доступен в списке полей сводной таблицы.

  8. Если вы подключены к кубу SQL Server Analysis Services 2008, по умолчанию создается динамический именованный набор. Этот именованный набор автоматически пересчитывается при каждом обновлении.

    • Чтобы предотвратить пересчет именованного набора при каждом обновлении, снимите флажок «Пересчет» с каждым флажком обновления.

  9. Нажмите кнопку « ОК», чтобы создать именованный набор.

    Примечания: 

    • Чтобы отменить все действия после закрытия диалогового окна, нажмите кнопку «Отменить» на панели быстрого доступа.

    • К именованным наборам нельзя применить фильтрацию любого типа.

К началу страницы

Изменение или удаление именованного набора

  1. Щелкните сводную таблицу OLAP, содержащую именованный набор, который требуется изменить или удалить.

  2. На вкладке «Параметры» в группе «Вычисления» щелкните «Поля», «Элементы», «& Наборы«, а затем выберите пункт «Управление наборами».

    ''Работа со сводными таблицами'': группа ''Вычисления'' на вкладке ''Параметры''

    Отобразится диалоговое окно «Диспетчер наборов». При необходимости можно изменить размер этого диалогового окна, перетащив маркер изменения размера в правом нижнем углу диалогового окна.

  3. Выберите набор, который требуется изменить или удалить.

  4. Выполните одно из указанных ниже действий.

    • Чтобы изменить выбранный именованный набор, нажмите кнопку «Изменить» и внесите необходимые изменения.

    • Чтобы удалить выбранный именованный набор, нажмите кнопку «Удалить», а затем нажмите кнопку «Да «, чтобы подтвердить.

К началу страницы

Распределяем список по наборам

Постановка задачи

Имеем список объектов (например, товаров) с пометкой, к какому набору (корзине) каждый из них относится. Необходимо разложить объекты по своим наборам, сформировав таблицу как на рисунке справа:

Исходные данные и результат

Похожие задачи встречаются на практике весьма часто — в случаях, когда приходится распределять те или иные ресурсы:

  • сотрудников по командам
  • водителей по маршрутам
  • клиентов по менеджерам
  • товары по корзинам и т.д.

В прошлом я уже делал статью и видео о похожей задаче, где мы разбирали как переложить одномерный столбец с данными в двумерную таблицу, но там ситуация была проще, т.к. каждый набор (строка) имел одинаковый размер (число столбцов). Здесь же количество элементов в наборах заранее не известно и не равно друг другу, так что подход придётся изменить.

Чтобы у вас был выбор, давайте разберем несколько способов решения этой задачи.

Способ 1. Вручную через сводную таблицу

Этот способ не предполагает автоматического обновления, поэтому годится только в тех случаях, когда нужно просто, быстро и разово решить такую задачу. Делаем следующее:

1. Ставим активную ячейку в любое место исходной таблицы и строим по ней сводную через Вставка — Сводная таблица (Insert — Pivot Table).

2. В панели полей сводной закидываем поле Корзина в область строк, поле Товары — в область столбцов и в область значений. На выходе должны получить сводную, где на пересечении корзины и товара будет число, если товар входит в заданную корзину:

Строим сводную

3. Выделяем центральную область данных в сводной, не включая итоги (диапазон E3:S8 в примере выше), копируем и вставляем специальной вставкой как значения в любое место листа.

4. В скопированном диапазоне выделим снова только центральный блок с числами без подписей и затем заставим Excel выделить только ячейки с числами, нажав клавишу F5 — кнопка Выделить Константы (F5 — Go to Special — Constants):

Выделяем ячейки с числами

5. Аккуратно, чтобы не сбить получившееся выделение, вводим в первую выделенную ячейку (она будет белой) ссылку на соответствующий ей товар (в нашем случае это будет ссылка на Брокколи), жмём на клавишу F4, чтобы оставить знак доллара только перед цифрой (т.е. закрепить строку) и сочетание клавиш Ctrl+Enter (чтобы ввести аналогичные формулы сразу во все выделенные ячейки):

Вставляем товары по ссылкам

6. Заменяем формулы на значения во всей таблице специальной вставкой.

7. Используя уже знакомый по п.4 трюк с клавишей F5Выделить на этот раз выделяем пустые ячейки и удаляем их со сдвигом влево:

Удаляем пустые ячейки со сдвигом влево

Задача решена.

Способ 2. Обновляемый запрос через Power Query

Этот способ чуть сложнее, но позволит не повторять весь процесс в будущем при изменении исходных данных — достаточно будет просто обновить наш запрос. Будем использовать для решения надстройку Power Query, которую для Excel 2010-2013 можно бесплатно скачать с сайта Microsoft. Начиная с версии Excel 2016, Power Query уже встроена в Microsoft Excel по умолчанию.

Чтобы решить нашу задачу, делаем следующее:

1. Превращаем исходную таблицу в динамическую «умную», чтобы не думать впоследствии о изменении её размеров. Можно использовать команду Главная — Форматировать как таблицу (Home — Format as Table) или сочетание клавиш Ctrl+T.

2. Загружаем полученную «умную» таблицу в Power Query через команду Данные — Из таблицы / диапазона (Data — From Table/Range).

3. Если хотим, чтобы в каждой корзине товары шли по алфавиту — сортируем таблицу сначала по корзинам, а потом по товарам, используя кнопки фильтра в шапке таблицы.

4. Группируем таблицу по корзинам, выбрав на вкладке Преобразование команду Группировать по (Transform — Group by) и задав в качестве операции Все строки (All rows):

Группируем строки по корзинам

Наша исходная таблица «схлопнется» до корзин, содержимое которых будет лежать во вложенных таблицах в последнем столбце:

Готовые группы во вложенных таблицах

5. Выбираем команду Добавление столбца — Настраиваемый столбец (Add Column — Custom column), чтобы добавить к каждой вложенной таблице столбец индекса с порядковым номером строки с помощью М-функции Table.AddIndexColumn:

Добавляем индексный столбец

6. Удаляем все столбцы, кроме последнего, а его содержимое разворачиваем иконкой с двойными стрелками в шапке таблицы. Получим, по сути, первоначальную таблицу, но с добавленной нумерацией товаров внутри каждой корзины:

Развернутая таблица с добавленными индексами в корзинах

7. Добавляем в последнем столбце к нумерации слово «Товар » с помощью команды Преобразование — Формат — Добавить префикс (Transform — Format — Add Prefix).

8. Последний штрих: выполняем свёртку по последнему столбцу с нумерацией с помощью команды Преобразование — Столбец сведения (Transform — Pivot Column):

Выполняем свёртку по столбцу Товар 1,2,3...

Задача решена! Осталось выгрузить полученные результаты обратно в Excel через Главная — Закрыть и загрузить — Закрыть и загрузить в… (Home — Close & Load — Close & Load to…)

Готовый результат запроса

При изменении данных в исходной таблице необходимо будет обновить наш запрос, щёлкнув по результирующей таблице правой кнопкой мыши и выбрав команду Обновить (Refresh) или кнопку Обновить всё на вкладке Данные (Data — Refresh All).

Способ 3. Функции динамических массивов

Этот способ подойдет только тем, у кого установлены последние обновления Office 365, которые добавили к функционалу Excel поддержку динамических массивов и новые функции для работы с ними: СОРТ, УНИК, ФИЛЬТР, ПОСЛЕД и СЛУЧМАССИВ. Если у вас Office 365, но этих функций пока нет — значит соответствующие обновления до вас ещё не добрались (их рассылают волнами и не по всем пользователям сразу), так что нужно немного подождать.

Этот способ хорош, в первую очередь, тем, что при любых изменениях в исходных данных — результаты обновляются «на лету» автоматически. Да и сам процесс не сильно сложен — потребуется всего три формулы.

Поехали:

1. Превращаем исходную таблицу в динамическую «умную», чтобы не думать впоследствии о изменении её размеров. Можно использовать команду Главная — Форматировать как таблицу (Home — Format as Table) или сочетание клавиш Ctrl+T.

2. Формируем отсортированный список уникальных названий корзин из столбца [Корзина] нашей умной таблицы Таблица4 — с помощью функций СОРТ (SORT) и УНИК (UNIQUE), соответственно:

Список корзин с помощью динамических массивов

3. Выводим все товары из каждой корзины с помощью функции ФИЛЬТР (FILTER):

Выводим товары из каждой корзины

По умолчанию, функция ФИЛЬТР выводит результаты в столбец. Чтобы развернуть их по горизонтали — в строку — используем дополнительно функцию транспонирования ТРАНСП (TRANSPOSE).

4. Добавляем шапку для красоты:

Добавляем шапку

Здесь логика такая:

  • Функция СЧЁТЕСЛИ (COUNTIF) вычисляет массив с размерами каждой корзины — это, в нашем случае, будет {4,2,7,1,2}
  • Затем функция МАКС (MAX) определяет в нём самое большое число (7)
  • Новая функция динамических массивов ПОСЛЕД (SEQUENCE) генерирует числовую последовательность от 1 до 7, к которой затем приклеивается слово «Товар » в начало.

Ссылки по теме

  • Динамические массивы — тихая революция в Excel
  • Трансформация столбца в таблицу (формулами и через Power Query)
  • Превращение строк в столбцы и обратно
1 Power Pivot Базовый №1. Простые вычисляемые столбцы, первая мера В этом уроке вы научитесь создавать простые вычисляемые столбцы в Power Pivot, а также создадите свою первую простую меру. 2 Power Pivot Базовый №2. Простые меры В этом уроке мы научимся создавать простые меры Power Pivot. Мы изучим функции SUM, COUNTROWS, DISTINCTCOUNT. Еще вы сможете повторить или изучить как работать со сводными таблицами в Excel и как создавать диаграммы Excel. 3 Power Pivot Базовый №3. Функция CALCULATE В этом уроке мы изучим функцию CALCULATE в Power Pivot, а также вспомним функции SUM, DISTINCTCOUNT и еще создадим условный столбец в данных. 4 Power Pivot Базовый №4. Как работает DAX В этом теоретическом уроке мы изучим как работают формулы DAX. 5 Power Pivot Базовый №5. Невозможно создать диаграмму этого типа В этом уроке мы разберем еще 1 способ обойти ошибку Невозможно создать диаграмму этого типа. Мы изучим еще одну формулу для создания динамического именного диапазона и создадим еще одну визуализацию — диаграмму дерево. 6 Power Pivot Базовый №6. Функции ALL, ALLSELECTED В этом уроке мы продолжим изучать функцию CALCULATE, а именно изучим функции ALL, ALLSELECTED, которые используются в параметре Фильтр. 7 Power Pivot Базовый №7. Множество таблиц, повторение пройденного В этом уроке мы начнем работать с множеством таблиц. Мы научимся создавать связи между таблицами и повторим почти все, что проходили ранее, но уже со множеством таблиц в модели данных. 8 Power Pivot Базовый №8. Несвязанные таблицы В этом видео я расскажу, что такое несвязанные таблицы и как ими пользоваться. Мы разберем пример с ценовыми порогами. Допустим вы хотите в сводной показать продажи товаров с ценой от 1 до 3 долларов. 9 Power Pivot Базовый №9. Функция FILTER В этом уроке мы изучим одну из важнейших DAX функций — FILTER. Она используется в параметре фильтра функции CALCULATE, когда в сравнении участвует мера. 10 Power Pivot Базовый №10. Работа с датой В этом уроке мы изучим функции для работы с датами, которые помогут нам вычислить сумму в том же периоде прошлого года, сумму с начала года и нарастающий итог за все время. 11 Power Pivot 11. Пользовательский календарь ч. 1 Вам нужно выполнить вычисления, опираясь на внутренний календарь компании, например, период в вашей компании начинается 29 числа, а заканчивается 28 числа следующего месяца. 12 Power Pivot Базовый №12. Посчитать рабочие дни Посчитаем количество рабочих дней в каждом месяце и среднюю сумму продаж в день для каждого месяца. 13 Power Pivot Базовый №13. Наборы (Сеты), ассиметричные сводные таблицы Научимся пользоваться наборами для создания асимметричных сводных таблиц, изучим функцию КУБЗНАЧЕНИЯ. 14 Power Pivot Базовый №14. Переключение детализации (Наборы, MDX, HASONEFILTER, VALUES) Создадим срез для переключения детализации с месяца на квартал.

Блеск и нищета сводных таблиц

Несколько слов о сессионных наборах

Новые возможности построения сводных отчетов

Маленькая ложка дегтя

Заключение

Предыдущая статья цикла была посвящена новым возможностям работы с многомерными пространствами, которые появились в последних версиях программы Microsoft Excel. В ней обсуждался новый инструмент по созданию пользовательских фильтров под названием Срезы данных. В настоящей публикации данная тема будет продолжена — речь пойдет о способах формирования наборов и вычисляемых элементов средствами клиентского приложения.

Несколько слов о сессионных наборах

Как известно, структура любого аналитического отчета и сводной таблицы Microsoft Excel в частности определяется тремя наборами элементов:

  • набор, размещаемый на оси X отчета;
  • набор, размещаемый на оси Y отчета;
  • набор, определяющий измерение среза Slicer Dimension, также называемый Осью фильтров.

В службах Microsoft Analysis Services есть специальная операция, позволяющая значительно упростить создание сложных наборов и при этом повысить общую производительность запросов. Речь идет об именованных наборах (Named Set). Именованные множества, так же как и вычисляемые элементы, могут быть определены в различных областях действия (Scopes).

Для большинства пользователей привычными являются только два режима создания наборов:

добавление в сценарий MDX — такой вариант делает набор видимым для всех запросов, адресованных к кубу;

определение набора как части конкретного MDX-выражения посредством инструкции WITH — в этом случае набор доступен только в контексте заданного выражения.

Однако существует еще один вариант, находящийся в тени первых двух, — определение набора в рамках сессии. На аналитический сервер можно послать директиву следующего вида (выражение 1):

Выражение 1

CREATE SESSION SET [Выручка].[БГД] AS

{

[Компания].[Бета],

[Компания].[Гамма],

[Компания].[Дельта]

}

Выражение 1 предписывает создать в кубе [Выручка] новое множество [БГД], состоящее из трех элементов измерения [Компания]. После выполнения данной инструкции во всех последующих запросах можно ссылаться на множество [БГД] без его дополнительного объявления в операторе Select. Сессионные наборы никак не влияют на структуру исходного аналитического куба и, что особенно важно, не видны другим пользователям системы. Строго говоря, они недоступны даже самому пользователю при обращении к серверу в рамках другой сессии. Но, за исключением ограничений в области видимости, сессионные наборы ничем не отличаются от наборов, которые были добавлены в базовый сценарий MDX.

Перечисленные обстоятельства делают наборы, определенные в рамках сессии, подходящим инструментом для реализации модных в последнее время идей «персонального BI». Действительно, при их использовании можно совершенно не заботиться о том, что они будут кому-то мешать или влиять на общую производительность приложения. Сводные таблицы в рамках двухуровневой архитектуры взаимодействуют с аналитическим сервером через OLE DB-провайдер, на который возложены все обязанности по организации сеансов связи. Потенциально с активными подключениями можно связать пользовательские наборы, однако действующая в Microsoft Excel 2007 объектная модель не позволяла этого делать. В Microsoft Excel 2010 указанный недостаток был наконец исправлен. Более того, управлять сессионными наборами теперь можно непосредственно через графический интерфейс электронной таблицы.

Новые возможности построения сводных отчетов

Все операции с наборами выполняются в специальной форме Диспетчер наборов, которая вызывается командой Управление наборами из раздела Поля, элементы и наборы контекстной ленты Параметры при работе со сводными таблицами.

Добавление нового набора в отчет производится путем нажатия кнопки Создать. При этом пользователю предоставляется возможность выбрать желаемый способ его определения: на основании готовых строк или столбцов уже существующего макета сводного отчета либо посредством MDX-выражения.

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

Жизненные реалии требуют проводить анализ данных по большему количеству аналитик. Для сводных таблиц это означает необходимость размещать на одной оси отчета элементы сразу из нескольких измерений. Про такие наборы из отчета говорят, что они состоят из кортежей элементов. С формированием наборов такого рода связано множество сложностей технического плана. Исходное решение, предложенное компанией Microsoft, было предельно простым. В «классическом» дизайнере сводных таблиц (до версии 2007 включительно) разрешен единственный способ создания многомерных наборов — посредством операции прямого произведения множеств. Прямое или декартово произведение множеств представляет собой всевозможные упорядоченные пары элементов из двух исходных множеств и всегда является симметричным. Иными словами, если в кубе есть измерение Год с элементами {[2009], [2010]}, а также измерение Сервис, содержащее элементы {[Абонентская плата], [Интернет­доступ]}, то на их базе можно составить единственный набор (набор 1).

Набор 1

{

([2009], [Абонентская плата])

([2009], [Интернет­доступ])

([2010], [Абонентская плата])

([2010], [Интернет­доступ])

}

Проблема заключалась в том, что раньше из набора 1 невозможно было удалить конкретный кортеж, например ([2009], [Интернет­доступ]). В арсенале доступных методов Microsoft Excel 2007 была единственная операция — выставление фильтра, то есть исключение какого-то элемента из базового одномерного набора. Понятно, что такая операция влечет за собой удаление из итогового набора всех кортежей, связанных с данным элементом. Так, если из набора элементов измерения Сервис удалить элемент [Интернет­доступ], то набор 1 потеряет не только кортеж ([2009], [Интернет­доступ]), что, собственно, и было нашей целью, но также кортеж ([2010], [Интернет­доступ]), наличие которого требовалось в выходном наборе.

В Microsoft Excel 2010 из имеющегося симметричного набора можно выделить его произвольное подмножество. Сначала в раздел строк отчета поместим измерения Год и Сервис. Затем в диспетчере наборов выберем опцию Создать набор по строкам… В открывшейся форме будет показан набор — прямое произведение исходных измерений (рис. 1).

Рис. 1. Симметричный набор кортежей

Множество кортежей, представленных на рис. 1, всегда соответствует текущему состоянию набора из раздела строк отчета сводной таблицы. Соответственно при желании кардинальность базового набора можно уменьшить, например сохранив в нем кортежи, относящиеся к 2009 и 2010 годам. Для этого в конструкторе сводных отчетов при помощи фильтров оставим в измерении Год только нужные временные периоды.

После создания симметричного набора можно переходить ко второму этапу — составлению на его базе требуемого асимметричного множества. В распоряжении пользователя есть три операции: удаление либо копирование существующих кортежей, а также добавление новых. Назначение операций вытекает из их названий. От себя добавим, что в наборе можно иметь неограниченное количество дубликатов кортежей. Кроме того, следует учитывать, что фильтрация наборов в макете отчета никак не влияет на добавление новых элементов набора. Даже если вы принудительно ограничили периоды в исходном наборе 2010 и 2011 годами, впоследствии вы всё равно сможете добавить кортеж с любым годом.

После определения состава входящих в набор элементов ему присваивается уникальное имя. Если набор был создан на базе единственного измерения, то в окне метаданных конструктора сводных таблиц он сразу помещается в папку соответствующей группы измерений. В тех случаях, когда для составления набора использовалось нескольких измерений, он помещается в отдельный каталог Наборы. Для упрощения навигации и поиска нужных наборов создаваемые множества можно рассортировать по дополнительным папкам. Для этого в поле Папка отображения формы необходимо ввести название каталога, куда требуется поместить новый набор.

Наконец, последний элемент формы, заслуживающий пояснительных комментариев, — это кнопка Изменить MDX… Ее нажатие приводит к переводу формы в режим редактирования MDX-выражения, описывающего текущее определение набора. Данную кнопку следует нажимать с осторожностью, так как вернуться обратно в «классический» режим формы уже не получится.

Разобравшись с принципом создания наборов на базе имеющихся строк или столбцов сводной таблицы, перейдем к рассмотрению основного режима построения наборов — посредством MDX-выражений. Для примера создадим простой набор «Услуги_Телефонии» на базе одного измерения Сервис (рис. 2).

Рис. 2. Создание набора на базе элементов одного измерения

Как видно из рис. 2, мастер построения наборов практически идентичен генератору MDX-запросов из среды Microsoft SQL Server Management Studio. Вдвойне приятно, что в нем поддерживаются многие операции, привычные по работе с Management Studio. В частности, в мастере возможно добавление элементов в набор путем перетаскивания объектов методом drag-and-drop из репозитария метаданных, а также вставка функций с уже готовым шаблоном заполнения аргументов. Заметим, что пользователю доступны не только объекты, хранящиеся на стороне сервера, но также наборы, созданные ранее в среде Microsoft Excel.

Для глобальных и сессионных наборов можно задать два правила их дальнейшего поведения. Первый режим: состав элементов набора определяется однократно в момент его создания. Примером такого набора является множество «Услуги_Телефонии», представленное на рис. 2. Очевидно, что множество, состоящее из двух явным образом перечисленных элементов, не будет меняться с течением времени. Но такое условие соблюдается не всегда. Например, при добавлении фактических значений в новый период куба может измениться набор tail(nonempty([Дата].[Месяц].members),3). Представленное выше выражение определяет «хвосты» — последние значения из набора непустых периодов. И эти «хвосты» будут постепенно смещаться в сторону старших дат по мере заполнения куба. Таким образом, со временем будет меняться и сам набор. Справедливым будет возражение, что изменение аналитического пространства является нечастой операцией, оттого вероятность, что она придется на одну сессию, невелика. Соответственно можно не переживать по этому поводу, так как в следующей сессии все наборы будут созданы заново. Это действительно так. Но, кроме приведенного выше случая, существует еще ряд других распространенных ситуаций, в которых состав набора может измениться. Причем часть из них имеет непосредственное отношение к Microsoft Excel и, что самое печальное, приводит к серьезным ошибкам при генерации сводных отчетов.

Поясним смысл сказанного на примере. Для этого определим следующий сессионный набор:

Выражение 2

СREATE SESSION SET [Выручка].[Лучшие_по_году] AS

TopCount( [Компания].[Компания].levels(1).members, 5, ([Measures].[Сумма]))

Выражение 2 очень простое — оно определяет пять лучших по объему продаж компаний. Зададимся вопросом: за какой период были выделены данные компании? Ведь пятерка лидеров может меняться от месяца к месяцу, от года к году и т.д. Набор [Лучшие_по_году] был определен в текущем глобальном контексте. Для каждого измерения выбирался элемент Default Member, который для измерения типа Time равен значению [All]. Соответственно пять компаний из набора [Лучшие_по_году] были определены по результатам продаж за все периоды. Принципиально важным здесь является следующий момент: после того как компании определены, их состав жестко фиксируется и в дальнейшем уже не меняется. Такие наборы первого типа называются Статическими — STATIC. Попробуем разобраться, к чему приводит их применение на практике.

После объявления набора [Лучшие_по_году] последовательно выполним два запроса: выражение 3 и выражение 4.

Выражение 3

select [Лучшие_по_году] on 0

from [Выручка]

Выражение 4

select [Лучшие_по_году] on 0

from (select {[Дата].[Год].&[2009]} on 0 from [Выручка])

Результаты их исполнения представлены на рис. 3 и 4 соответственно.

Рис. 3. Статический набор в глобальном контексте

Рис. 4. Статический набор в контексте конкретного года

Отчет, представленный на рис. 3, выглядит абсолютно логично. В нем приводится суммарная выручка лучших компаний за весь период наблюдений. Но что касается данных, представленных на рис. 4, то нельзя однозначно утверждать, что они соответствуют ожиданиям пользователя. В представленном отчете показаны лучшие компании за весь период, но выручка приводится за 2009 год. Хорошо, если именно такой отчет был истинной целью его составителя. Сводная таблица Microsoft Excel, соответствующая выражению 4, содержит всего две строки (рис. 5).

Рис. 5. Выручка лучших за весь
период компаний в 2009 году

Однако обычно пользователей интересует иное: «требуется выбрать пять лучших компаний по объему продаж именно 2009 года». Практически это означает необходимость заново пересчитать набор [Лучшие_по_году] — на этот раз в контексте выражения 4. А для этого придется отказаться от требования его неизменности во времени.

В службах Microsoft Analysis Services имеется возможность создать набор, который будет пересчитываться для каждого запроса, из которого он вызван. Такие наборы называют Динамическими — DYNAMIC. Соответственно пользователь должен сам выбрать, какой из двух режимов больше отвечает его потребностям и решаемым задачам. Тип набора в MDX-выражении указывается директивой STATIC или DYNAMIC. Так, выражение 2 можно переписать следующим образом (выражение 5).

Выражение 5

СREATE SESSION DYNAMIC SET [Выручка].[Лучшие_по_году] AS

TopCount( [Компания].[Компания].levels(1).members, 5, ([Measures].[Сумма]))

В результате чего при запуске выражения 4 будет возвращаться другой результирующий набор. В нем показываются лучшие компании 2009 года (рис. 6).

Рис. 6. Динамический набор
в контексте конкретного  года

При создании сессионных наборов в среде Microsoft Excel пользователь избавлен от необходимости написания скриптовых команд. Выбор требуемого типа набора выполняется посредством выставления специального флага Пересчитывать набор при каждом обновлении в Диспетчере наборов (см. рис. 2). Поставленный флажок означает, что создаваемый набор должен быть динамическим. Следует отметить, что динамические наборы в среде Microsoft Excel налагают на разработчика определенные ограничения. Если в MDX-выражении, определяющем набор, в качестве аргументов присутствуют динамические наборы, то такой набор должен быть объявлен как динамический.

Маленькая ложка дегтя

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

Во­первых, в наборах, заданных в сессии, запрещено использование операторов, которые исполняются в контексте оператора Select. Для пояснения смысла последней фразы рассмотрим следующий код:

Выражение 6

with set [Лучшие_по_году] as TopCount([Компания].[Компания].[Компания].members,5,([Measures].[Сумма],Axis(0).Item(0)))

select [Дата].[Год].&[2010] on 0,

[Лучшие_по_году] on 1

from [Выручка]

В выражении 6 определяется набор [Лучшие_по_году], состоящий из первых пяти лучших по объему выручки компаний за период, значение которого является первым элементом набора, отложенного по оси Х. Оси добавляются в отчет в порядке их нумерации: сначала ось Х (номер 0), затем ось Y (номер 1). Поэтому к моменту создания набора для оси Y набор для оси X будет уже сформирован. Это, в свою очередь, означает, что к элементам данного набора можно обратиться программно — такая операция выполняется при помощи оператора Axis(0). В частности, инструкция Axis(0).Item(0) выбирает первый элемент из получившегося набора, который затем добавляется в кортеж. Результат исполнения выражения 6 показан на рис. 7.

Рис. 7. Создание набора в контексте оператора Select

Но оператор Axis(0) имеет смысл только внутри запроса: пока не определена ось Х, не может быть создан и набор [Лучшие_по_году]. Набор [Лучшие_по_году] определяется посредством инструкции With, которая является неотъемлемой частью оператора Select. Поэтому о функциях, подобных Axis, говорят, что они выполняются в контексте оператора Select.

Во­вторых, сессионные наборы, создаваемые внутри сводных таблиц Microsoft Excel, не переопределяют глобальный контекст. Вкратце напомним читателям, о чем идет речь. Как уже отмечалось, именованные множества могут быть созданы в трех режимах: глобальном контексте, контексте сессии либо контексте конкретного MDX-запроса. В случае одноименных наборов каждый последующий контекст переопределяет предыдущий.

Например, в сценарий MDX на уровне куба можно добавить именованный набор [Лучшие_по_году] следующего вида:

Выражение 7

CREATE SET CURRENTCUBE.[Лучшие_по_году] AS

TopCount( [Компания].[Компания].levels(1).members, 5, ([Measures].[Сумма], [Дата].[Год].&[2009]))

Как видно из записи выражения 3, исходный набор [Лучшие_по_году] выбирает пять лучших компаний по объемам дохода, полученного в 2009 году. Затем на уровне сессии допускается создать новый экземпляр набора [Лучшие_по_году]:

Выражение 8

CREATE SESSION SET [Выручка].[Лучшие_по_году] AS

TopCount( [Компания].[Компания].levels(1).members, 5, ([Measures].[Сумма], [Дата].[Год].[2010]))

Теперь при обращении к множеству [Лучшие_по_году] из последующих запросов, сделанных в рамках сессии, вместо лучших компаний 2009 года будут выводиться компании — лидеры 2010 года.

Но и это не предел. В конкретном запросе посредством директивы With можно определить еще одну версию набора [Лучшие_по_году].

Выражение 9

with set [Лучшие_по_году] as

TopCount( [Компания].[Компания].levels(1).members, 5, ([Measures].[Сумма], [Дата].[Год].[2011]))

select [Лучшие_по_году] on 0

from [Выручка]

Несмотря на то что в глобальном контексте множество [Лучшие_по_году] определяется по доходам компаний 2009 года, после чего в рамках сессии переопределяется заново на основании доходов 2010 года, в запросе из выражения 5 оно будет рассчитываться на основании своего последнего определения — по выручке 2011 года.

Операция переопределения наборов хороша тем, что носит «каскадный» характер. Иными словами, она синхронно меняет не только сам набор, но и все множества, созданные на его основе. Более того, в аналитическом сервере возможна интересная манипуляция. В базовый сценарий MDX исходный набор добавляется повторно под новым псевдонимом:

Выражение 10

CREATE SET CURRENTCUBE.[Лучшие_по_году_расш] AS

{[Лучшие_по_году]}

Затем в сценарии определяются новые вычисляемые элементы, использующие в качестве входных аргументов набор [Лучшие_по_году_расш]. При такой организации логики вычислений изменение текущего контекста конкретного набора приведет к изменению глобального контекста всех связанных с ним объектов — как наборов, так и вычисляемых элементов.

Что делать, если стандартных возможностей недостаточно

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

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

Выражение 11

filter([Компания].[Компания].[Компания].members, ([Measures].[Сумма],[Дата].[Год].&[2011])>([Measures].[Сумма], [Дата].[Год].&[2010]))

Во втором — динамический набор (выражение 12).

Выражение 12

filter( [Компания].[Компания].[Компания].members, ([Measures].[Сумма]) > ([Measures].[Сумма], [Дата].[Год].PrevMember)).

Первый из представленных вариантов фиксирует единственный интервал (2010 г.; 2011 г.), второй позволяет получить все возможные временные диапазоны (2009 г.; 2010 г.), (2010 г.; 2011 г.), (2011 г.; 2012 г.), но только фиксированной длины — 1 год. Нас же интересует универсальное решение, при котором пользователь сможет указать любую начальную и конечную дату (отстоящие друг от друга на произвольное число календарных периодов) и сформировать для них соответствующий набор из клиентов компании. При помощи аналитических выражений такого результата достичь невозможно.

Единственный выход из сложившейся ситуации — исправить саму текстовую строку, содержащую MDX-выражение. Такую операцию всегда можно выполнить вручную при помощи формы управления наборами. Но если ее требуется повторять регулярно, то рутинные действия проще автоматизировать путем написания программного кода на языке VBA.

Работа со сводными таблицами изначально была основана на использовании двух специальных объектов от компании Panorama Software (создателя сводных таблиц) PivotCache и PivotTable. Первый из них представляет собой набор записей, полученных из определенного OLAP-источника, и связан с рабочей книгой в целом. Второй объект— PivotTable — определяет внешнее представление отчета конкретной сводной таблицы и связан с отдельным листом книги. В последних версиях Microsoft Excel (2007 и 2010) вместо объекта PivotCashe можно применять альтернативный вариант — коллекцию Connections. В нашем примере мы будем использовать именно ее.

Активные подключения, связанные с книгой, доступны для просмотра в форме Подключения, которая активируется одноименной командой на ленте Данные (рис. 8).

Рис. 8. Диспетчер активных подключений к книге

Как видно из рис. 8, в нашем примере с книгой ассоциировано единственное подключение Выручка, посредством которого в книге Microsoft Excel показываются данные по доходам отдельных компаний.

Кнопка Управление наборами позволяет добавлять в действующее подключение новые именованные наборы либо редактировать уже имеющиеся. Создадим новый набор «Растущие_Компании» на базе следующего MDX-выражения (выражение 13).

Выражение 13

Filter([Компания].[Компания].[Компания],[Дата].[Дата].[Год].&[2009]<[Дата].[Дата].[Год].&[2011])

После выполнения указанной операции набор «Растущие_Компании» можно использовать во всех сводных отчетах, созданных на основе подключения Выручка. Сформируем теперь новый сводный отчет, в котором на оси Y разместим недавно созданный набор (рис. 9).

Рис. 9. Создание универсального отчета

Напомним, что нам требуется выбрать начальный и конечный периоды, а затем динамически вычислить удовлетворяющее заданному условию множество компаний. Выполним несколько подготовительных операций. На листе с отчетом определим две именованные ячейки Год_Начало и Год_Конец, куда при помощи оператора ВПР() будем подставлять выражение элемента из измерения [Дата] для выбранного пользователем года.

Кроме того, добавим на лист новый управляющий элемент типа «кнопка», который свяжем с процедурой Пересчет_Набора, представленной в листинге 1.

Листинг 1

Sub Пересчет_Набора()

Dim Formula_MDX As String

Formula_MDX = “Filter([Компания].[Компания].[Компания],” + Range(“Год_Начало”).Value + “<” + Range(“Год_Конец”).Value + “)”

With ActiveWorkbook.Connections(«Выручка»).OLEDBConnection

.CalculatedMembers(«[Растущие_Компании]»).Delete

.CalculatedMembers.Add Name:=»[Растущие_Компании]», _

Formula:=Formula_MDX, _

Type:=xlCalculatedSet

End With

ActiveSheet.PivotTables(«Раб_Отчет»).RefreshTable

End Sub

Процедура Пересчет_Набора состоит из трех этапов. Сначала в строковой переменной с именем Formula_MDX составляется новое MDX-выражение, куда подставляются текущие значения из ячеек Год_Начало и Год_Конец.

На втором шаге из подключения Выручка удаляется набор «Растущие_Компании». Затем в коллекцию CalculatedMembers данного подключения добавляется одноименный набор, но с MDX-выражением, заданным ранее определенной строкой Formula_MDX. Кроме того, в момент создания определяется тип нового вычисляемого элемента — xlCalculatedSet.

Заметим, что созданный с помощью процедуры набор получил название набора, который ранее уже был добавлен в сводный отчет. Поэтому нам не требуется изменять его положение в отчете, а для отображения нового множества в сводной таблице ее достаточно просто обновить. Соответствующая команда еActiveSheet.PivotTables(“Раб_Отчет»).RefreshTable завершает нашу процедуру.

Подход, основанный на программном обращении к свойствам объектов, обладает дополнительным преимуществом — с его помощью в отчеты сводных таблиц можно добавлять не только новые сессионные наборы, но и собственные вычисляемые элементы.

Предположим, что нам требуется рассчитать величину прироста дохода текущего периода по сравнению с предыдущим. Данный показатель (назовем его «Прирост») легко вычисляется по формуле:

Выражение 14

([Measures].[Сумма])-([Measures].[Сумма],[Дата].[Дата].PrevMember)

Чтобы на базе выражения 14 сделать новую вычисляемую меру, достаточно немного модифицировать код из листинга 1 (см. листинг 2):

Листинг 2

Sub New_Measure_Member()

With ActiveWorkbook.Connections(«Выручка»).OLEDBConnection

.CalculatedMembers.Add Name:=»[Прирост]», _

Formula:=»([Measures].[Сумма])-([Measures].[Сумма],[Дата].[Дата].PrevMember)», _

Type:=xlCalculatedMember

End With

End Sub

В представленном фрагменте кода, так же как и в программе из листинга 1, производится добавление нового элемента в коллекцию CalculatedMembers объекта Connection. Главное отличие состоит в типе (Type) создаваемого элемента: в первом случае это был xlCalculatedSet (Вычисляемый набор), а во втором — xlCalculatedMember (Вычисляемый элемент). После исполнения процедуры New_Measure_Member() в имеющемся подключении «Выручка» будет создана новая вычисляемая мера «Прирост». Она будет доступна для составления отчетов во всех сводных таблицах, организованных на базе данного подключения.

Похожим образом новые элементы добавляются на оси измерений. Однако в данном случае немного сложнее становится синтаксис объявления имени элемента. Он должен учитывать тот факт, что любое измерение всегда является множеством с заданным на нем отношением порядка. Иными словами, при создании элемента важно указать его место расположения.

Рассмотрим для примера иерархию Дата из группы измерений Дата, представленную четырьмя уровнями: All, Год, Квартал и Месяц. При желании вычисляемый элемент можно расположить на любом из них (рис. 10).

Рис. 10. Размещение вычисляемого элемента СМ на различных уровнях иерархии Дата

Выбор конкретного места в иерархии производится путем указания родительского элемента. Так, если требуется, чтобы вычисляемый элемент СМ присутствовал на уровне Год, его нужно определить следующим образом: [Дата].[Дата].[(All)].[All].[СМ]. Данная запись означает, что элемент СМ должен быть потомком элемента ALL, размещенного на уровне ALL. Принимая во внимание тот факт, что уровень ALL представлен единственным одноименным элементом, исходную запись можно сократить, сделав более компактной, — [Дата].[Дата].[All].[СМ].

Предположим теперь, что нам требуется разместить СМ на следующем уровне — Квартал. Все элементы с данного уровня объединены в группы по отношению к тому или иному году. Если мы хотим, чтобы новый вычисляемый элемент был помещен после кварталов, относящихся к 2009 году, но перед кварталами 2010 года, то должны указать 2009 год в качестве родительского для вычисляемого элемента: [Дата].[Дата].[Год].&[2009].[СМ]. Аналогичным образом следует поступить при размещении элемента на уровне Месяц. Например, чтобы вычисляемый элемент шел после месяцев II квартала 2009 года, его следует определить следующим образом: [Дата].[Дата].[Квартал].&[2009].&[2КВ].[СМ].

Важно понимать, что указание полного пути к элементу­родителю в имени вычисляемого элемента определяет лишь его физическое размещение в иерархии, но сам он при этом не включается в структуру агрегации. Например, элемент [Дата].[Дата].[Год].&[2009].[СМ] хоть и входит в группу кварталов 2009 года, но не является его потомком. Однако для любого вычисляемого элемента определено отношение родства по восходящей линии — его предок на каждом вышестоящем уровне иерархии.

Рис. 11 иллюстрирует данную идею. В MDX-выражении задан вычисляемый элемент СМ, который размещается на уровне Месяц. Затем при помощи оператора Ascendants() успешно формируется набор из элементов-предков элемента СМ. Обратная операция — попытка показать СМ в наборе из потомков элемента верхнего уровня — будет безуспешной.

Рис. 11. Вычисляемый элемент имеет предков на вышестоящих уровнях…

Подобный дуализм в поведении вычисляемых элементов хоть и требует некоторого времени на привыкание, на самом деле весьма практичен. С одной стороны, он исключает необоснованное увеличение агрегационных сумм (вычисляемый элемент не является чьим-либо потомком), а с другой — позволяет использовать функции навигации в многомерном пространстве при составлении MDX-выражений (у вычисляемого элемента есть предки на каждом вышестоящем уровне).

Примером применения данного свойства в работе служит программа, представленная в листинге 3, которая создает в иерархии Дата три вычисляемых элемента с именем СМ. Все элементы определяются одним и тем же MDX-выражением, суммирующим показатели двух первых потомков от прямого предка вычисляемого элемента. Поскольку вычисляемые элементы размещены на разных уровнях иерархии Дата, это приводит к изменению контекста исполнения MDX-выражения, а в конечном счете — к различным значениям показателя СМ в сводном отчете (рис. 12).

Рис. 12. Добавление вычисляемых элементов
в отчет сводной таблицы

Листинг 3

Public Sub New_Dim_Member()

Dim Formula_MDX As String

Formula_MDX = «aggregate({[Дата].[Дата].CurrentMember.Parent.FirstChild,[Дата].[Дата].CurrentMember.Parent.FirstChild.NextMember})»

With ActiveWorkbook.Connections(«Выручка»).OLEDBConnection

.CalculatedMembers.Add Name:=»[Дата].[Дата].[All].[CM]», _

Formula:=Formula_MDX, _

Type:=xlCalculatedMember

.CalculatedMembers.Add Name:=»[Дата].[Дата].[2009].[CM]», _

Formula:=Formula_MDX, _

Type:=xlCalculatedMember

.CalculatedMembers.Add Name:=»[Дата].[Дата].[2009].[2КВ].[CM]», _

Formula:=Formula_MDX, _

Type:=xlCalculatedMember

End With

End Sub

Заключение

В статье были рассмотрены различные способы создания наборов и вычисляемых элементов, доступные в последних версиях программы Microsoft Excel. Описанная функциональность позволяет значительно повысить гибкость разработки прикладных отчетов и реализовать в среде Microsoft Excel модель персонального BI.

КомпьютерПресс 08’2013

#Руководства

  • 13 май 2022

  • 0

Как систематизировать тысячи строк и преобразовать их в наглядный отчёт за несколько минут? Разбираемся на примере с квартальными продажами автосалона

Иллюстрация: Meery Mary для Skillbox Media

Ксеня Шестак

Рассказывает просто о сложных вещах из мира бизнеса и управления. До редактуры — пять лет в банке и три — в оценке имущества. Разбирается в Excel, финансах и корпоративной жизни.

Сводная таблица — инструмент для анализа данных в Excel. Она собирает информацию из обычных таблиц, обрабатывает её, группирует в блоки, проводит необходимые вычисления и показывает итог в виде наглядного отчёта. При этом все параметры этого отчёта пользователь может настроить под себя и свои потребности.

Разберёмся, для чего нужны сводные таблицы. На конкретном примере покажем, как их создать, настроить и использовать. В конце расскажем, можно ли делать сводные таблицы в «Google Таблицах».

Сводные таблицы удобно применять, когда нужно сформировать отчёт на основе большого объёма информации. Они суммируют значения, расположенные не по порядку, группируют данные из разных участков исходной таблицы в одном месте и сами проводят дополнительные расчёты.

Вид сводной таблицы можно настраивать под себя самостоятельно парой кликов мыши — менять расположение строк и столбцов, фильтровать итоги и переносить блоки отчёта с одного места в другое для лучшей наглядности.

Разберём на примере. Представьте небольшой автосалон, в котором работают три менеджера по продажам. В течение квартала данные об их продажах собирались в обычную таблицу: модель автомобиля, его характеристики, цена, дата продажи и ФИО продавца.

Таблица, в которой хранятся данные о продажах автосалона
Скриншот: Skillbox Media

В конце квартала планируется выдача премий. Нужно проанализировать, кто принёс больше прибыли салону. Для этого нужно сгруппировать все проданные автомобили под каждым менеджером, рассчитать суммы продаж и определить итоговый процент продаж за квартал.

Разберёмся пошагово, как это сделать с помощью сводной таблицы.


Создаём сводную таблицу

Чтобы сводная таблица сработала корректно, важно соблюсти несколько требований к исходной:

  • у каждого столбца исходной таблицы есть заголовок;
  • в каждом столбце применяется только один формат — текст, число, дата;
  • нет пустых ячеек и строк.

Теперь переходим во вкладку «Вставка» и нажимаем на кнопку «Сводная таблица».

Жмём сюда, чтобы создать сводную таблицу
Скриншот: Skillbox Media

Появляется диалоговое окно. В нём нужно заполнить два значения:

  • диапазон исходной таблицы, чтобы сводная могла забрать оттуда все данные;
  • лист, куда она перенесёт эти данные для дальнейшей обработки.

В нашем случае выделяем весь диапазон таблицы продаж вместе с шапкой. И выбираем «Новый лист» для размещения сводной таблицы — так будет проще перемещаться между исходными данными и сводным отчётом. Жмём «Ок».

Выделяем диапазон исходной таблицы и отмечаем лист, где разместится сводная
Скриншот: Skillbox Media

Excel создал новый лист. Для удобства можно сразу переименовать его.

Слева на листе расположена область, где появится сводная таблица после настроек. Справа — панель «Поля сводной таблицы», в которые мы будем эти настройки вносить. В следующем шаге разберёмся, как пользоваться этой панелью.

Появился новый лист для сводной таблицы
Скриншот: Skillbox Media

Настраиваем сводную таблицу и получаем результат

В верхней части панели настроек находится блок с перечнем возможных полей сводной таблицы. Поля взяты из заголовков столбцов исходной таблицы: в нашем случае это «Марка, модель», «Цвет», «Год выпуска», «Объём», «Цена», «Дата продажи», «Продавец».

Нижняя часть панели настроек состоит из четырёх областей — «Значения», «Строки», «Столбцы» и «Фильтры». У каждой области своя функция:

  • «Значения» — проводит вычисления на основе выбранных данных из исходной таблицы и относит результаты в сводную таблицу. По умолчанию Excel суммирует выбранные данные, но можно выбрать другие действия. Например, рассчитать среднее, показать минимум или максимум, перемножить.

    Если данные выбранного поля в числовом формате, программа просуммирует их значения (например, рассчитает общую стоимость проданных автомобилей). Если формат данных текстовый — программа покажет количество ячеек (например, определит количество проданных авто).

  • «Строки» и «Столбцы» — отвечают за визуальное расположение полей в сводной таблице. Если выбрать строки, то поля разместятся построчно. Если выбрать столбцы — поля разместятся по столбцам.
  • «Фильтры» — отвечают за фильтрацию итоговых данных в сводной таблице. После построения сводной таблицы панель фильтров появляется отдельно от неё. В ней можно выбрать, какие данные нужно показать в сводной таблице, а какие — скрыть. Например, можно показывать продажи только одного из менеджеров или только за выбранный период.

Настроить сводную таблицу можно двумя способами:

  • Поставить галочку напротив нужного поля — тогда Excel сам решит, где нужно разместить это значение в сводной таблице, и сразу заберёт его туда.
  • Выбрать необходимые для сводной таблицы поля из перечня и перетянуть их в нужную область вручную.

Первый вариант не самый удачный: Excel редко ставит данные так, чтобы с ними было удобно работать, поэтому сводная таблица получается неинформативной. Остановимся на втором варианте — он предполагает индивидуальные настройки для каждого отчёта.

В случае с нашим примером нужно, чтобы сводная таблица отразила ФИО менеджеров по продаже, проданные автомобили и их цены. Остальные поля — технические характеристики авто и дату продажи — можно будет использовать для фильтрации.

Таблица получится наглядной, если фамилии менеджеров мы расположим построчно. Находим в верхней части панели поле «Продавец», зажимаем его мышкой и перетягиваем в область «Строки».

После этого в левой части листа появится первый блок сводной таблицы: фамилии менеджеров по продажам.

Добавляем в сводную таблицу поле «Продавцы» через область «Строки»
Скриншот: Skillbox

Теперь добавим модели автомобилей, которые эти менеджеры продали. По такому же принципу перетянем поле «Марка, модель» в область «Строки».

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

Добавляем в сводную таблицу поле «Марка, модель» через область «Строки»
Скриншот: Skillbox Media

Определяем, какая ещё информация понадобится для отчётности. В нашем случае — цены проданных автомобилей и их количество.

Чтобы сводная таблица самостоятельно суммировала эти значения, перетащим поля «Марка, модель» и «Цена» в область «Значения».

Добавляем в сводную таблицу поля «Марка, модель» и «Цена» через область «Значения»
Скриншот: Skillbox Media

Теперь мы видим, какие автомобили продал каждый менеджер, сколько и по какой цене, — сводная таблица самостоятельно сгруппировала всю эту информацию. Более того, напротив фамилий менеджеров можно посмотреть, сколько всего автомобилей они продали за квартал и сколько денег принесли автосалону.

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


Настраиваем фильтры сводной таблицы

Чтобы можно было фильтровать информацию сводной таблицы, нужно перенести требуемые поля в область «Фильтры».

В нашем примере перетянем туда все поля, не вошедшие в основной состав сводной таблицы: объём, дату продажи, год выпуска и цвет.

Над сводной таблицей появился дополнительный блок с фильтрами
Скриншот: Skillbox Media

Для примера отфильтруем данные по году выпуска: настроим фильтр так, чтобы сводная таблица показала только проданные авто 2017 года.

В блоке фильтров нажмём на стрелку справа от поля «Год выпуска»:

Появилось всплывающее окно для фильтрации
Скриншот: Skillbox Media

В появившемся окне уберём галочку напротив параметра «Выделить все» и поставим её напротив параметра «2017». Закроем окно.

Фильтруем таблицу по году выпуска проданных автомобилей
Скриншот: Skillbox Media

Теперь сводная таблица показывает только автомобили 2017 года выпуска, которые менеджеры продали за квартал. Чтобы снова показать таблицу в полном объёме, нужно в том же блоке очистить установленный фильтр.

Так выглядит отфильтрованная сводная таблица
Скриншот: Skillbox Media

Фильтры можно выбирать и удалять как удобно — в зависимости от того, какую информацию вы хотите увидеть в сводной таблице.


Проводим дополнительные вычисления

Сейчас в нашей сводной таблице все продажи менеджеров отображаются в рублях. Предположим, нам нужно понять, каков процент продаж каждого продавца в общем объёме. Можно рассчитать это вручную, а можно воспользоваться дополнениями сводных таблиц.

Кликнем правой кнопкой на любое значение цены в таблице. Выберем параметр «Дополнительные вычисления», затем «% от общей суммы».

Меняем структуру квартальных продаж менеджеров на процентную
Скриншот: Skillbox

Теперь вместо цен автомобилей в рублях отображаются проценты: какой процент каждый проданный автомобиль составил от общей суммы продаж всего автосалона за квартал. Проценты напротив фамилий менеджеров — их общий процент продаж в этом квартале.

Сводная таблица самостоятельно рассчитала процент продаж за квартал для каждого менеджера
Скриншот: Skillbox Media

Можно свернуть подробности с перечнями автомобилей, кликнув на знак слева от фамилии менеджера. Тогда таблица станет короче, а данные, за которыми мы шли, — кто из менеджеров поработал лучше в этом квартале, — будут сразу перед глазами.

Так сводная таблица выглядит в свёрнутом виде
Скриншот: Skillbox Media

Чтобы снова раскрыть данные об автомобилях — нажимаем +.

Чтобы значения снова выражались в рублях — через правый клик мыши возвращаемся в «Дополнительные вычисления» и выбираем «Без вычислений».


Обновляем данные сводной таблицы

Предположим, в исходную таблицу внесли ещё две продажи последнего дня квартала.

В исходной таблице появились две дополнительные строки
Скриншот: Skillbox

В сводную таблицу эти данные самостоятельно не добавятся — изменился диапазон исходной таблицы. Поэтому нужно поменять первоначальные параметры.

Переходим на лист сводной таблицы. Во вкладке «Анализ сводной таблицы» нажимаем кнопку «Изменить источник данных».

Жмём сюда, чтобы изменить исходный диапазон
Скриншот: Skillbox Media

Кнопка переносит нас на лист исходной таблицы, где нужно выбрать новый диапазон. Добавляем в него две новые строки и жмём «ОК».

Добавляем в исходный диапазон две новые строки
Скриншот: Skillbox Media

После этого данные в сводной таблице меняются автоматически: у менеджера Трегубова М. вместо восьми продаж становится десять.

Данные в сводной таблице обновились автоматически
Скриншот: Skillbox Media

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

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

Меняем данные двух ячеек в исходной таблице
Скриншот: Skillbox Media

Чтобы данные сводной таблицы тоже обновились, переходим на её лист и во вкладке «Анализ сводной таблицы» нажимаем кнопку «Обновить».

Теперь у менеджера Соколова П. изменились данные в столбце «Цена, руб.».

Жмём сюда, чтобы обновить данные
Скриншот: Skillbox Media

Как использовать сводные таблицы в «Google Таблицах»? Нужно перейти во вкладку «Вставка» и выбрать параметр «Создать сводную таблицу». Дальнейший ход действий такой же, как и в Excel: выбрать диапазон таблицы и лист, на котором её нужно построить; затем перейти на этот лист и в окне «Редактор сводной таблицы» указать все требуемые настройки. Результат примет такой вид:

Так выглядит сводная таблица в «Google Таблицах»
Скриншот: Skillbox Media

Научитесь: Excel + Google Таблицы с нуля до PRO
Узнать больше

Понравилась статья? Поделить с друзьями:
  • Excel сводные таблицы итоги в одну строку
  • Excel сводные таблицы если впр
  • Excel сводные таблицы группировка строк
  • Excel сводные таблицы видео бесплатно
  • Excel сводная таблица формат по умолчанию