Данные в таблицах можно располагать разными способами, но есть 2 основных общепринятых: широкие таблицы и длинные таблицы. Ниже – о том, чем они различаются, где используются и как преобразовывать одни таблицы в другие.
Обычные таблицы строятся по модели EAV, «сущность-атрибут-значение». Например, у нас есть таблица с данными людей, для каждого человека указано имя и возраст. Имя – это сущность (о ком мы говорим), возраст – это атрибут (о чем мы говорим), конкретное число – это значение (то, чему равен атрибут). У каждой сущности может быть несколько атрибутов – например, для каждого человека мы записываем возраст, рост и вес.
Так вот, разница между широким форматом и длинным форматом – в том, каким образом мы записываем атрибуты (с шириной столбцов это не связано, если что). Для создания таблицы в широком формате мы помещаем сущности в заголовки строк, а атрибуты – в заголовки столбцов, что позволяет сформировать матрицу:
Возраст |
Рост |
Вес |
|
Саша |
31 |
190 |
79 |
Петя |
42 |
178 |
112 |
Миша |
55 |
183 |
93 |
Для узкой таблицы мы помещаем атрибут сразу за сущностью – это позволяет обойтись всего 3 столбцами, «сущность-атрибут-значение», но для каждой сущности нам нужно вписывать несколько атрибутов/значений, что делает таблицу длинной:
Сущность |
Атрибут |
Значение |
Саша |
Возраст |
31 |
Саша |
Рост |
190 |
Саша |
Вес |
79 |
Петя |
Возраст |
42 |
Петя |
Рост |
178 |
Петя |
Вес |
112 |
Миша |
Возраст |
55 |
Миша |
Рост |
183 |
Миша |
Вес |
93 |
В плане оформления таблиц для людей – широкие однозначно выигрывают, потому что использование заголовка столбца в виде атрибута существенно повышает читаемость таблицы. Но есть проблема: системные таблицы, хранящиеся в реляционных базах данных (то есть всех, в которых есть SQL), оптимизированы под длинные таблицы, поэтому вынесение атрибутов в отдельные столбцы существенно уменьшает производительность базы данных – экспоненциально растет количество операций записи/чтения при составлении сложных запросов. Поэтому для хранения данных в сводных таблицах принято использовать узкий формат, в то время как временные таблицы для презентаций и анализа делают широкими.
Из того, что мы описали выше, следует логичный вопрос: как преобразовать длинную таблицу в широкую? Обратное преобразование тоже иногда требуется, но – крайне редко, плюс для преобразования широкой таблицы в длинную нужно совершить противоположные действия, поэтому кейс «широкие -> длинные таблицы» мы рассматривать не будем. Универсального ответа на вопрос нет, потому что у каждой системы хранения информации – свои инструменты преобразования таблиц.
Начнем с SQL. У этого языка есть специальная команда – PIVOT – которая нужна для того, чтобы преобразовать нормализованную таблицу в более широкую. У нее есть антипод – команда UNPIVOT – которая делает таблицу более узкой. Например, у нас есть такая вот узкая таблица с данными по продажам за каждый квартал последних двух лет:
CREATE TABLE Sales (
Year INT,
Quarter INT,
Amount DECIMAL(10, 2)
);
INSERT INTO Sales (Year, Quarter, Amount) VALUES
(2023, 1, 1000.00),
(2023, 2, 1500.00),
(2023, 3, 2000.00),
(2023, 4, 2500.00),
(2024, 1, 1100.00),
(2024, 2, 1600.00),
(2024, 3, 2100.00),
(2024, 4, 2600.00);
Преобразование этой таблицы в широкую с помощью PIVOT:
SELECT Year,
[1] AS Q1,
[2] AS Q2,
[3] AS Q3,
[4] AS Q4
FROM (
SELECT Year, Quarter, Amount
FROM Sales
) AS SourceTable
PIVOT (
SUM(Amount)
FOR Quarter IN ([1], [2], [3], [4])
) AS PivotTable;
Сначала мы указываем четверти года в качестве столбцов, затем через PIVOT заполняем отдельные ячейки – и получаем готовую широкую таблицу:
В Excel для преобразования есть специальная функция – «Сводная таблица». Сначала вам нужно выделить всю таблицу, затем на вкладке «Вставка» выбрать «Сводная таблица». Excel предложит выбрать диапазон сводной таблицы, после чего в настройках полей сводной таблицы нужно будет указать те данные, которые будут использоваться в качестве строк, столбцов и значений (содержимое ячеек). Примените настройки – и получите новую широкую таблицу.
С Google Sheets это работает так же, как и с Excel – выделяете таблицу, используете инструмент «Сводная таблица» (лежит на вкладке «Вставка»), настраиваете строки-столбцы-значения, создаете новую таблицу.