PostgreSQL говорит, что «return и sql tuple описания несовместимы»

Вопрос:У меня есть следующие данные: ID CLASS VALUE 1 NHB 700905.7243 1 HBW 164216.1311 1 HBO 700905.7243 2 NHB 146023.3792 2 HBW 89543.2972 2 HBO 82152.072 3 NHB 1409818.328 3 HBW 220430.7922 3 HBO 323512.9391 4 NHB 48711.3814 4 HBW 163385.1575 4 HBO 363352.3441 Что я хочу реорганизовать как: ID HBO HBW NHB 1 700905.7243

Вопрос:

У меня есть следующие данные:

ID CLASS VALUE 1 NHB 700905.7243 1 HBW 164216.1311 1 HBO 700905.7243 2 NHB 146023.3792 2 HBW 89543.2972 2 HBO 82152.072 3 NHB 1409818.328 3 HBW 220430.7922 3 HBO 323512.9391 4 NHB 48711.3814 4 HBW 163385.1575 4 HBO 363352.3441

Что я хочу реорганизовать как:

ID HBO HBW NHB 1 700905.7243 164216.1311 700905.7243 2 82152.072 89543.2972 146023.3792 3 323512.9391 220430.7922 1409818.328 4 363352.3441 163385.1575 48711.3814

Обратите внимание, что значения в столбцах HBW, HBO и NHB являются суммами (суммой).

Вот script, который я использую для создания вывода:

— CREATE EXTENSION tablefunc; SELECT * FROM CROSSTAB ( ‘SELECT _tlfd.id, _tlfd.»class», _tlfd.»value» FROM public._tlfd WHERE _tlfd.»class» = »HBW» or _tlfd.»class» = »HBO» or _tlfd.»class» = »NHB» ORDER BY 1,2’ ) AS ( «class» int, «HBW» text, «HBO» text, «NHB» text, —«Purpose» varchar, «value» double precision );

Когда я запускаю script, я получаю эту ошибку:

ERROR: return and sql tuple descriptions are incompatible.

Я не уверен, что это значит и как исправить ошибку. Может кто-нибудь, пожалуйста, дайте мне знать:

  • Что я делаю неправильно в script?
  • Будет ли мой script выдавать желаемый результат?

Лучший ответ:

Это работает для меня в Postgres 9.3:

SELECT * FROM crosstab ( $$SELECT id, class, «value» FROM _tlfd WHERE class = ANY (‘{HBW, HBO, NHB}’) ORDER BY 1,2$$ ) AS t ( class int, — needs a table alias! «HBW» float8, — resulting columns are double precision! «HBO» float8, «NHB» float8 — «value» double precision — column does not exist in result! );

Производит требуемый вывод. Я не могу предоставить SQLfiddle, так как там невозможно установить дополнительные модули.

Основные изменения

  • псевдоним таблицы (жирный t)
  • удаленная лишняя колонка «value»
  • правильный тип данных для столбцов данных (double precision a.k.a. float8)

Остальное – дело вкуса и стиля. Я бы не использовал value в качестве имени столбца, поскольку это зарезервированное слово в SQL.

Подробности в этом ответном ответе:
Запрос перекрестной пересылки PostgreSQL

Оцените статью
Добавить комментарий