Зачем в запросе на выборку данных для crosstab необходимо указывать VALUES?

Почему при использовании функции crosstab в PostgreSQL 16 запрос не работает без части ', 'VALUES (''кофты''), (''ботинки''), (''пальто')'? Я не смог найти информацию об этом в документации. Почему значения VALUES в моем примере обязательны для выполнения запроса, хотя в документации об этом не упоминается?
  • 1 февраля 2024 г. 6:11
Ответы на вопрос 2
Функция `crosstab` в PostgreSQL используется для трансформации результата SQL-запроса из формы строк в форму таблицы, где строки преобразуются в столбцы. Для того чтобы функция правильно выполнила трансформацию, она должна знать, какие значения будут в новых столбцах. Для этого и используется списки `VALUES`, которые указывают диапазон значений, которые ожидаются в категориальной переменной (поле, по которому производится транспонирование).

Пример использования `crosstab`:

```sql
SELECT *
FROM crosstab(
  'SELECT category, key, value FROM your_table ORDER BY 1,2',
  'VALUES (''кофты''), (''ботинки''), (''пальто'')'
) AS ct (category text, кофты numeric, ботинки numeric, пальто numeric);
```

В данном запросе:
1. первый аргумент функции `crosstab` - это SQL-запрос, который возвращает данные в виде трех колонок: первая колонка для разных категорий (или групп), вторая колонка для ключей в пределах каждой категории и третья колонка для значений, ассоциированных с каждым ключом.
2. второй аргумент `crosstab` - это `VALUES` с явным перечислением ожидаемых значений ключей. Это необходимо для корректной работы функции, чтобы знать, какие именно столбцы должны быть созданы.

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

Обратите внимание, что, хотя документация PostgreSQL официально не требует использования `VALUES` (так как это часть более сложного варианта функции `crosstab`), на практике эта часть запроса часто необходима, чтобы задать контекст для корректного построения таблицы.

Если у вас есть трудности с поиском соответствующего раздела в документации или вы используете какой-то специфический плагин/модуль для работы с `crosstab`, рекомендуется обратить внимание на документацию этого модуля или на сообщества разработчиков PostgreSQL, где могут быть опубликованы соответствующие примеры и обсуждения.
https://www.postgresql.org/docs/current/tablefunc.... 
The main limitation of the single-parameter form of crosstab is that it treats all values in a group alike, inserting each value into the first available column. If you want the value columns to correspond to specific categories of data, and some groups might not have data for some of the categories, that doesn't work well. The two-parameter form of crosstab handles this case by providing an explicit list of the categories corresponding to the output columns.

crosstab(text, text) вариант не требует именно values. Второй аргумент функции может быть любым запросом, который сгенерирует полный список категорий. Этот вариант crosstab нужен, если первый запрос может возвращать данные не для всех категорий.

С точки зрения синтаксиса, insert .. values - это то же самое, что insert .. select, а values - это частный случай select только списка констант
melkij=> VALUES ('кофты'), ('ботинки'), ('пальто');
column1
---------
кофты
ботинки
пальто
(3 строки)

это самодостаточный запрос. Можно записать как select 'кофты' union all select 'ботинки' union all select 'пальто', но зачем?
Похожие вопросы