Функция `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, где могут быть опубликованы соответствующие примеры и обсуждения.