Как сделать сводную таблицу в sql
Перейти к содержимому

Как сделать сводную таблицу в sql

  • автор:

Сводные таблицы в SQL

Сводная таблица – один из самых базовых видов аналитики. Многие считают, что создать её средствами SQL невозможно. Конечно же, это не так.

Предположим, у нас есть таблица с данными закупок нескольких видов товаров (Product 1, 2, 3, 4) у разных поставщиков (A, B, C):

Типичная задача – определить размер закупок по поставщикам и товарам, т.е. построить сводную таблицу. Пользователи MS Excel привыкли получать такую аналитику буквально парой кликов:

В SQL это не так быстро, но большинство решений тривиальны.

Тестовые данные

-- таблица с полями: поставщик (supplier), товар (product), объем поставки (volume) create table test_supply (supplier varchar null, -- varchar2(10) в Oracle, и т.п. product varchar null, -- varchar2(10) в Oracle, и т.п. volume int null ); -- тестовые данные insert into test_supply (supplier, product, volume) values ('A', 'Product 1', 928); insert into test_supply (supplier, product, volume) values ('A', 'Product 1', 422); insert into test_supply (supplier, product, volume) values ('A', 'Product 4', 164); insert into test_supply (supplier, product, volume) values ('A', 'Product 1', 403); insert into test_supply (supplier, product, volume) values ('A', 'Product 3', 26); insert into test_supply (supplier, product, volume) values ('B', 'Product 4', 594); insert into test_supply (supplier, product, volume) values ('B', 'Product 4', 989); insert into test_supply (supplier, product, volume) values ('B', 'Product 3', 844); insert into test_supply (supplier, product, volume) values ('B', 'Product 4', 870); insert into test_supply (supplier, product, volume) values ('B', 'Product 2', 644); insert into test_supply (supplier, product, volume) values ('C', 'Product 2', 733); insert into test_supply (supplier, product, volume) values ('C', 'Product 2', 502); insert into test_supply (supplier, product, volume) values ('C', 'Product 1', 97); insert into test_supply (supplier, product, volume) values ('C', 'Product 3', 620); insert into test_supply (supplier, product, volume) values ('C', 'Product 2', 776); -- проверка select * from test_supply; 

1. Оператор CASE и аналоги

Самый простой и очевидный способ получения сводной таблицы – это хардкод с использованием оператора CASE . Например, для поставщика А можно вычислить размер поставок как sum(case when t.supplier = ‘A’ then t.volume end ). Чтобы получить объем поставок для разных товаров достаточно просто добавить группировку по полю product :

select t.product, sum(case when t.supplier = 'A' then t.volume end) as A from test_supply t group by t.product order by t.product; 

Если добавить else 0 , то для товаров, по которым не было поставок, вместо null будут выведены нули:

select coalesce(t.product, 'total_sum') as product, sum(case when t.supplier = 'A' then t.volume end) as A from test_supply t group by t.product; 

Если продублировать код для всех поставщиков (которых у нас три — A, B, C), мы получим необходимую нам сводную таблицу:

select t.product, sum(case when t.supplier = 'A' then t.volume end) as A, sum(case when t.supplier = 'B' then t.volume end) as B, sum(case when t.supplier = 'C' then t.volume end) as C from test_supply t group by t.product order by t.product; 

В неё можно добавить итог по строкам (как обычную сумму, т.е. sum(t.volume) ):

select t.product, sum(case when t.supplier = 'A' then t.volume end) as A, sum(case when t.supplier = 'B' then t.volume end) as B, sum(case when t.supplier = 'C' then t.volume end) as C, sum(t.volume) as total_sum from test_supply t group by t.product; 

Не составит труда добавить и итог по столбцам. Для этого необходим использовать оператор ROLLUP , который позволит добавить суммирующую строку. В большинстве СУБД используется синтаксис rollup(t.product) , хотя иногда доступен и альтернативный t.product with rollup (например, SQL Server).

select t.product, sum(case when t.supplier = 'A' then t.volume end) as A, sum(case when t.supplier = 'B' then t.volume end) as B, sum(case when t.supplier = 'C' then t.volume end) as C, sum(t.volume) as total_sum from test_supply t group by rollup(t.product); 

Результат можно сделать ещё красивее, заменив NULL на собственную подпись итога. Для этого можно использовать функцию coalesce() : coalesce(t.product, ‘total_sum’) , или же любой специфичный для конкретной СУБД аналог (например, nvl() в Oracle). Результат будет следующим:

select coalesce(t.product, 'total_sum') as product, sum(case when t.supplier = 'A' then t.volume end) as A, sum(case when t.supplier = 'B' then t.volume end) as B, sum(case when t.supplier = 'C' then t.volume end) as C, sum(t.volume) as total_sum from test_supply t group by rollup(t.product); 

Если СУБД не поддерживает ROLLUP .

Если ваша СУБД настолько стара, что не поддерживает rollup, – придётся использовать костыли. Например, так:

select t.product, sum(case when t.supplier = 'A' then t.volume end) as A, sum(case when t.supplier = 'B' then t.volume end) as B, sum(case when t.supplier = 'C' then t.volume end) as C, sum(t.volume) as total_sum from test_supply t group by t.product union all select 'total_sum', sum(case when t.supplier = 'A' then t.volume end), sum(case when t.supplier = 'B' then t.volume end), sum(case when t.supplier = 'C' then t.volume end), sum(t.volume) as total_sum from test_supply t; 

Можно (но вряд ли стоит) использовать какую-либо из вендоро-специфичных функций вместо стандартного CASE . Например, в PostgreSQL и SQLite доступен оператор FILTER :

select coalesce(t.product, 'total_sum') as product, sum(t.volume) filter (where t.supplier = 'A') as A, sum(t.volume) filter (where t.supplier = 'B') as B, sum(t.volume) filter (where t.supplier = 'C') as C, sum(t.volume) as total_sum from test_supply t group by rollup(t.product); 

Особенность FILTER в том, что он является частью стандарта (SQL:2003), но фактически поддерживается только в PostgreSQL и SQLite.

В других СУБД есть ряд эквивалентов CASE, не предусмотренных стандартом: IF в MySQL, DECODE в Oracle, IIF в SQL Server 2012+, и т.д. В большинстве случаев их использование не несёт никаких преимуществ, лишь усложняя поддержку кода в будущем.

MySQL: IF

select coalesce(t.product, 'total_sum') as product, sum(IF(t.supplier = 'A', t.volume, null)) as A, sum(IF(t.supplier = 'B', t.volume, null)) as B, sum(IF(t.supplier = 'C', t.volume, null)) as C, sum(t.volume) as total_sum from test_supply t group by rollup(t.product); 

Oracle: DECODE

select coalesce(t.product, 'total_sum') as product, sum(decode(t.supplier, 'A', t.volume, null)) as A, sum(decode(t.supplier, 'B', t.volume, null)) as B, sum(decode(t.supplier, 'C', t.volume, null)) as C, sum(t.volume) as total_sum from test_supply t group by rollup(t.product); 

SQL Server 2012 или выше: IIF

select coalesce(t.product, 'total_sum') as product, sum(iif(t.supplier = 'A', t.volume, null)) as A, sum(iif(t.supplier = 'B', t.volume, null)) as B, sum(iif(t.supplier = 'C', t.volume, null)) as C, sum(t.volume) as total_sum from test_supply t group by rollup(t.product); 

2. Использование PIVOT (SQL Server и Oracle)

Описанный выше подход трудно назвать красивым. Как минимум, хочется не дублировать код для каждого поставщика, а просто их перечислить. Сделать это позволяет разворот (PIVOT) таблицы, доступный в в SQL Server и Oracle. Хотя этот оператор не предусмотрен стандартом SQL, обе СУБД предлагают идентичный синтаксис.

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

select t.supplier, t.product, sum(t.volume) as agg from test_supply t group by t.product, t.supplier; 

И этого будет достаточно – если нам нужны итоги только по товарам и по провайдерам. Если же мы хотим получить все возможные итоги, необходимо выбрать все возможные сочетания товара и провайдера, в том числе такие где товар или провайдер NULL :

select t.supplier, t.product, sum(t.volume) as agg from test_supply t group by t.supplier, t.product union all select null, t.product, sum(t.volume) from test_supply t group by t.product union all select t.supplier, null, sum(t.volume) from test_supply t group by t.supplier union all select null, null, sum(t.volume) from test_supply t; 

Этот запрос можно существенно упростить, используя оператор CUBE :

select t.supplier, t.product, sum(t.volume) as agg from test_supply t group by cube(t.supplier, t.product); 

Если мы хотим получить подпись итогов как ‘total_sum’ вместо NULL запрос необходимо немного откорректировать:

select coalesce(t.supplier, 'total_sum') as supplier, coalesce(t.product, 'total_sum') as product, sum(t.volume) as agg from test_supply t group by cube(t.supplier, t.product); 

К такому результату уже можно применять PIVOT:

select * from ( select coalesce(t.supplier, 'total_sum') as supplier, coalesce(t.product, 'total_sum') as product, sum(t.volume) as agg from test_supply t group by cube(t.supplier, t.product) ) t pivot (sum(agg) -- NB: ниже в SQL Server - двойные кавычки, в Oracle DB - одинарные for supplier in ("A", "B", "C", "total_sum") ) pvt ; 

Здесь мы «поворачиваем» таблицу из прошлого запроса, используя агрегатную функцию суммы sum(agg) . При этом заголовки столбцов мы берём из поля supplier , а с помощью in («A», «B», «C», «total_sum») указываем какие конкретно поставщики должны быть выведены ( total_sum отвечает за столбец с итогами по строкам).

3. Common table expression

В принципе, для «поворота» таблицы нам не нужен оператор PIVOT как таковой. Этот запрос можно легко переписать, используя стандартный синтаксис — комбинацию CTE (common table expression) и соединений. Для этого будем использовать тот же запрос, что и для PIVOTа:

with cte as ( select coalesce(t.supplier, 'total_sum') as supplier, coalesce(t.product, 'total_sum') as product, sum(t.volume) as agg from test_supply t group by cube(t.supplier, t.product) ) select * from cte; 

Из результатов, полученных в cte нам необходимы только уникальные значения товаров:

select distinct t.product from cte t 

… к которым можно поочередно присоединять объем закупок для каждого отдельно взятого поставщика:

left join cte a on t.product = a.product and a.supplier = 'A' 

Здесь мы используем левое соединение т.к. у поставщика может не быть поставок по некоторым продуктам.

Окончательный запрос будет выглядеть таким образом:

with cte as ( select coalesce(t.supplier, 'total_sum') as supplier, coalesce(t.product, 'total_sum') as product, sum(t.volume) as agg from test_supply t group by cube(t.supplier, t.product) ) select distinct t.product, a.agg as A, b.agg as B, c.agg as C, ts.agg as total_sum from cte t left join cte a on t.product = a.product and a.supplier = 'A' left join cte b on t.product = b.product and b.supplier = 'B' left join cte c on t.product = c.product and c.supplier = 'C' left join cte ts on t.product = ts.product and ts.supplier = 'total_sum' order by product; 

Конечно, такой запрос — это proof-of-concept, поэтому выглядит он довольно экзотично.

4. Функция CROSSTAB (PostgreSQL)

В PostgreSQL доступна функция CROSSTAB , которая примерно эквивалентна PIVOT в SQL Server или Oracle. Для работы с ней необходимо расширение tablefunc :

create extension tablefunc; -- для PostgreSQL 9.1+

CROSSTAB принимает в качестве основного аргумента запрос как text sql . Он будет практически тем же, что и для PIVOT , но с обязательным использованием сортировки:

select coalesce(t.product, 'total_sum') as product, coalesce(t.supplier, 'total_sum') as supplier, sum(t.volume) as agg from test_supply t group by cube(t.supplier, t.product) order by product, supplier; 

В отличие от PIVOT, для «разворота» таблицы нам необходимо указывать не только названия столбцов, но и типы данных. Например, так: «product» varchar, «A» bigint, «B» bigint, «C» bigint, «total_sum» bigint .

Ещё один нюанс состоит в том, что CROSSTAB заполняет строки слева направо, игнорируя NULL-овые значения. Например, такой запрос:

select * from crosstab ( $$select coalesce(t.product, 'total_sum') as product, coalesce(t.supplier, 'total_sum') as supplier, sum(t.volume) as agg from test_supply t group by cube(t.supplier, t.product) order by product, supplier $$ ) as cst("product" varchar, "A" bigint, "B" bigint, "C" bigint, "total_sum" bigint); 

… вернёт совсем не то, что мы хотим:

Как можно заметить, там, где были NULL-овые значения, всё «съехало» влево. Например, в первой строке для Product1 итог по строке оказался в столбце для поставщика С, а поставки С — в столбце поставщика В (для которого поставок не было). Корректно проставлены данные только для Product3 т.к. для этого товара у всех поставщиков были значения. Иными словами, если бы у нас не было NULL-овых значений, запрос был бы корректным и вернул нужный результат.

Чтобы не сталкиваться с таким поведением CROSSTAB нужно использовать вариант функции с двумя параметрами. Второй параметр должен содержать запрос, выводящий список всех столбцов в результате. В нашем случае это все названия поставщиков из таблицы + «total_sum» для итогов:

(select distinct tt.supplier as supplier from test_supply tt order by supplier) union all select 'total_sum' 

… а полный запрос будет выглядеть так:

select * from crosstab ( $$select coalesce(t.product, 'total_sum') as product, coalesce(t.supplier, 'total_sum') as supplier, sum(t.volume) as agg from test_supply t group by cube(t.supplier, t.product) order by product, supplier $$, $$ (select distinct tt.supplier as supplier from test_supply tt order by supplier ) union all select 'total_sum' $$ ) as cst("product" varchar, "A" bigint, "B" bigint, "C" bigint, "total_sum" bigint); 

5. Динамический SQL (на примере SQL Server)

Запрос с PIVOT или CROSSTAB уже функциональнее, чем изначальный с CASE (или CTE), но названия поставщиков все ещё необходимо вносить вручную. Но что делать, если поставщиков много? Или если их список регулярно обновляется? Хотелось бы выбирать их автоматически как как select distinct supplier from test_supply (или же из словаря, если он есть).

Здесь чистого SQL недостаточно. Он подразумевает статическую типизацию: для создания плана запроса СУБД нужно заранее указать число столбцов. Поэтому, например, синтаксис PIVOT не позволяет использовать подзапрос. Но это ограничение легко обойти с помощью динамического SQL! Для этого названия столбцов необходимо преобразовать в строку формата «элемент_1», «элемент_2», …, «элемент_n» , и использовать их в запросе.

Например, в SQL Server мы можем использовать STUFF для получения такой строки

declare @colnames as nvarchar(max); select @colnames = stuff((select distinct ', ' + '"' + t.supplier + '"' from test_supply t for xml path ('') ), 1, 1, '' ) + ', "total_sum"'; 

… а затем включить её в окончательный запрос:

-- T-SQL (!) declare @colnames as nvarchar(max), @query as nvarchar(max); select @colnames = stuff((select distinct ', ' + '"' + t.supplier + '"' from test_supply t for xml path ('') ), 1, 1, '' ) + ', "total_sum"'; set @query = 'select * from ( select coalesce(t.supplier, ''total_sum'') as supplier, coalesce(t.product, ''total_sum'') as product, sum(t.volume) as agg from test_supply t group by cube(t.supplier, t.product) ) as t pivot (sum(agg) for supplier in (' + @colnames + ') ) as pvt'; execute(@query); 

Динамический SQL вполне можно применить и к самому первому решению с CASE . Например, так:

-- T-SQL (!) select distinct supplier into #colnames from test_supply; declare @colname as nvarchar(max), @query as nvarchar(max); set @query = 'select coalesce(t.product, ''total_sum'') as product'; while exists (select * from #colnames) begin select top 1 @colname = supplier from #colnames; delete from #colnames where supplier = @colname; set @query = @query + ', sum(case when t.supplier = ''' + @colname + ''' then t.volume end) as ' + @colname end; set @query = @query + ' , sum(t.volume) as total_sum from test_supply t group by rollup(t.product)' drop table #colnames; execute(@query); 

Здесь используется цикл для итерации по доступным поставщикам в таблице test_supply (можно заменить на словарь, если он есть), после чего формируется соответствующий кусок запроса:

 sum(case when t.supplier = '' then t.volume end) as , sum(case when t.supplier = '' then t.volume end) as . , sum(case when t.supplier = '' then t.volume end) as

Во многих СУБД доступно аналогичное решение. Тем не менее, мы уже слишком отдалились от чистого SQL. Любое использование динамического SQL подразумевает углубление в специфику конкретной СУБД (и соответствующего ей процедурного расширения SQL).

Итого: как мы выяснили, сводную таблицу можно легко создать средствами SQL. Более того, это можно множеством разных методов — достаточно лишь выбрать оптимальный для вашей СУБД.

Операторы PIVOT и UNPIVOT

Чтобы объяснить, что такое PIVOT, я бы начал с электронных таблиц EXCEL. В версии MS Excel 5.0 появились так называемые сводные таблицы. Сводные таблицы представляют собой двумерную визуализацию многомерных структур данных, применяемых в технологии OLAP для построения хранилищ данных. Правильней даже сказать двумерные сечения трехмерных OLAP-кубов, если иметь в виду наличие на сводной таблице элемента, который называется «страница». Сводные таблицы позволяют выполнять стандартные операции с многомерными структурами, например, упоминавшееся уже сечение куба, свертку и детализацию – операцию обратную свертке.

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

Такие свойства сводных таблиц позволяют их использовать, наряду со сводными диаграммами, в качестве клиента для визуального отображения многомерных данных, находящихся в хранилищах, поддерживаемых различными СУБД (например, MS Cистема управления реляционными базами данных (СУБД), разработанная корпорацией Microsoft. Язык структурированных запросов) — универсальный компьютерный язык, применяемый для создания, модификации и управления данными в реляционных базах данных. SQL Server Analysis Services).

Чтобы пояснить сказанное примером, давайте рассмотрим такой запрос к одной из учебных баз на sql-ex.ru:

Консоль

Выполнить

результатом которого является такая таблица:

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

Типы продукции

П
р
о
и
з
в
о
д
и
т
е
л
и

Заголовками строк здесь являются уникальные имена производителей, которые берутся из столбца maker вышеприведенного запроса, а заголовками столбцов – уникальные типы продукции (соответственно, из столбца type). А что должно быть в середине? Ответ очевиден – некоторый агрегат, например, функция count(type), которая подсчитает для каждого производителя отдельно число моделей ПК, ноутбуков и принтеров, которые и заполнят соответствующие ячейки этой таблицы.

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

Можно сказать, что pivot-таблица в SQL – это одноуровневая сводная таблица.

Оператор PIVOT не является стандартным (я не уверен, что он когда-нибудь будет стандартизован ввиду нереляционной природы pivot-таблицы), поэтому я буду использовать в примерах его реализацию в языке T-SQL (Transact-SQL) — процедурное расширение языка SQL, используемое для программирования на стороне сервера в Microsoft SQL Server и Sybase ASE. T-SQL (SQL Server 2005/2008).

Я могу и ошибиться в хронологии, но мне представляется, что успех реализации сводной таблицы в Excel привел к появлению так называемых перекрестных запросов в Access, и, наконец, к оператору PIVOT в T-SQL.

Особенности: ORACLE

В Oracle операции PIVOT и DRILLDOWN (UNPIVOT) были отданы на откуп средствам визуализации OLAP, т.е. MS Excel, BusinessObjects и пр.

В Oracle 11g появились pivot/unpivot, но в pivot есть «тонкость» — нужно ЯВНО указывать столбцы, если результат нужен в ТАБЛИЧНОМ виде. Получение данных для столбцов, не указанных явно, также возможно, но только в виде XML.

Сводные таблицы в SQL

Знание языка SQL позволяет шире взглянуть на получение и обработку данных. Кроме того, вы будете лучше понимать, как работает клиентское приложение, когда обращается к SQL-серверу. А еще некоторые манипуляции с данными удобнее проводить прямо на сервере.

иконка на айти-тему

Самородов Федор Анатольевич

Мастер-класс проведет уникальный преподаватель-эксперт

Самородов Федор Анатольевич – специалист широкого профиля в области проектирования и разработки программного обеспечения. Обладает многолетним опытом работы в качестве руководителя команды разработчиков и главного архитектора. Специализируется на интеграции корпоративных приложений, разработке архитектуры веб-порталов, системах анализа данных, развертывании и поддержке Windows-инфраструктуры. Microsoft Certified Master.

С чем вы познакомитесь?

Формат сводной таблицы – это классика отчётного жанра. Обычно сводные таблицы строятся на клиентской стороне в различных приложениях, разработанных под работу с отчётами. На мастер-классе вы увидите, как можно сделать таблицы на серверной стороне средствами SQL.

иконка вы узнаете

иконка комп

Где получить полноценные знания?

Изучить язык запросов с нуля, научиться строить сложные отчеты и анализировать данные различными способами вы сможете на курсе «Анализ данных на языке SQL».

Учебный центр «Специалист»

  • >1,4 млн выпускников
  • > 35 000 корпоративных клиентов
  • 250 преподавателей-экспертов
  • 80 учебных классов
  • > 1000 курсов
  • Гарантия высокого качества обучения
  • Более 250 преподавателей-экспертов высокой квалификации
  • Гарантированное расписание на год
  • Официальные документы после обучения (проверка через ФИС ФРДО)
  • Профессиональная консультация по направлению обучения
  • Удобное время занятий
  • Форматы обучения: очное, онлайн, открытое или очно-заочное
  • Авторизованные курсы от ведущих IT-компаний мира
  • Престижные российские и международные сертификаты
  • Уникальные технические лаборатории
  • Корпоративное обучение
  • Индивидуальный менеджмент
  • Трудоустройство
  • Программа привилегий «Настоящий специалист»

Создание сводных таблиц Excel на основе данных SQL Server

В связи со всеобщей глобализацией в Excel 2010 были серьезно усовершенствованы средства подключения к транзакционным базам данных, таким как SQL Server. С помощью новых, встроенных в Excel инструментов создание сводных таблиц на основе баз данных SQL Server становится предельно простым занятием.

Начните с перехода на вкладку ленты Данные (Data). Щелкните на кнопке Из других источников (From Other Sources) и в раскрывающемся меню выберите команду С сервера SQL Server (From SQL Server), как показано на рис. 7.24.

Рис. 7.24. Выберите в раскрывающемся списке команду С сервера SQL Server

Рис. 7.24. Выберите в раскрывающемся списке команду С сервера SQL Server

Тем самым вы запустите мастер подключения данных (рис. 7.25). С его помощью в Excel настраивается ссылка на внешние данные, расположенные на сервере. В рассматриваемом случае готовый файл примера отсутствует. В нашей демонстрации проиллюстрирована процедура взаимодействия Excel и SQL Server. Действия, которые вы будете выполнять для подключения к собственной базе данных, полностью повторяют описанные ниже.

На первом шаге мастера нужно снабдить Excel регистрационными данными. Как видно на рис. 7.25, от вас требуется ввести имя сервера, а также имя пользователя и пароль доступа к данным.

Рис. 7.25. Введите регистрационные данные и щелкните на кнопке Далее

Рис. 7.25. Введите регистрационные данные и щелкните на кнопке Далее

При вводе регистрационных данных в Windows достаточно установить переключатель Использовать проверку подлинности Windows (Windows Authentication). Далее укажите базу данных, из которой будут извлекаться данные, выбрав ее в раскрывающемся меню, в котором перечисляются все базы данных, хранящиеся на заданном сервере. В данном случае была выбрана база данных ReportServer. Выбор этой базы данных приводит к отображению в нижней части окна всех ее таблиц и видов. Вам осталось только указать анализируемую таблицу или вид, а затем щелкнуть на кнопке Далее.

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

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

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

  • Имя файла (File Name). В этом поле можно изменить имя файла с расширением .ode (Office Data Connection), генерируемого с целью хранения параметров создаваемого подключения.
  • Сохранить пароль в файле (Save Password in File). Этот флажок, расположенный под полем ввода имени файла, заставляет хранить пароль доступа к внешнему файлу в самом файле параметров конфигурации подключения. Не забывайте о том, что пароль вводится в файл в незашифрованном виде, поэтому любой заинтересованный пользователь может легко получить к нему доступ. Имейте в виду, что пароль не зашифрован, поэтому любой пользователь может узнать ваш пароль путем простого просмотра файла в текстовом редакторе.
  • Описание (Description). В этом поле вводится краткое описание назначения устанавливаемого подключения.
  • Понятное имя (Friendly Name). В качестве понятного (для пользователей) имени обычно используется собственное название внешнего источника данных. Это название должно быть более значимым для вас, чем то, которое дал ему его создатель.

Закончив со вводом всей необходимой информации, щелкните на кнопке Готово (Finish). Вы увидите на экране последнее диалоговое окно — Импорт данных (Import Data). Теперь установите переключатель Отчет сводной таблицы и щелкните на кнопке ОК, после чего переходите к непосредственному управлению отчетом сводной таблицы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *