PostgreSQL говорит: "описания кортежей return и sql несовместимы"
у меня есть следующие данные:
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 являются суммами (sum).
вот скрипт, который я использую для создания вывода:
-- 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
);
когда я запускаю скрипт я получаю эту ошибку:
ERROR: return and sql tuple descriptions are incompatible.
Я не уверен, что это означает и как исправить ошибку. Кто-нибудь, пожалуйста, позвольте мне ... знаю:
- что я делаю неправильно в сценарии?
- будет ли мой скрипт производить желаемый результат?
1 ответов
это работает для меня на 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.к. a.float8
)
остальное-дело вкуса и стиль. Я бы не использовал value
как имя столбца, хотя, так как это зарезервированное слово в SQL.
подробности в этом соответствующем ответе:
Запрос Перекрестной Таблицы PostgreSQL