postgres crosstab, ERROR: предоставленный SQL должен возвращать 3 столбца - PullRequest
0 голосов
/ 03 сентября 2018

Здравствуйте! Я создал представление, но хочу его развернуть.

ВЫХОД перед поворотом:

   tag1  |  qmonth1  |  qmonth2  |  sum1
 --------+-----------+-----------+--------
 name1   |  18-05   |  MAY      |  -166
 name2   |  18-05   |  MAY      |  -86
 name3   |  18-05   |  MAY      |  35
 name1   |  18-06   |  JUN      |  -102
 name2   |  18-06   |  JUN      |  -32
 name3   |  18-06   |  JUN      |  -75
 name1   |  18-09   |  AVG      |  -135
 name2   |  18-09   |  AVG      |  -52
 name3   |  18-09   |  AVG      |  -17

ожидаемый результат:

 qmonth2 | name1 | name2 | name3
 --------+-------+-------+-------
  MAY    | -166  | -86  |  35
  JUN    | -102  | -32  | -75
  AVG    | -135  | -52  | -17

мой полный запрос:

SELECT tag1,qmonth2,sum1 FROM crosstab 
('SELECT tag1::text,qmonth1,qmonth2::text,sum1::numeric 
FROM public."chartdata_chart3"') 
AS ct ( "tag1" TEXT,"qmonth2" TEXT,"sum1" NUMERIC);

Я получаю эту ошибку и не могу ее устранить:

ERROR:  invalid source data SQL statement
DETAIL:  The provided SQL must return 3 columns: rowid, category, and values.
SQL state: 22023

1 Ответ

0 голосов
/ 03 сентября 2018

Оператор SQL, переданный как параметр в crosstab(), функция должна возвращать один столбец row_name, один столбец категории и один столбец значений. В вашем случае это qmonth2, tag1 и sum1.

Это ваш запрос, учитывая, что sum1 является целым числом, qmonth2 и tag1 являются текстом:

select *
from crosstab(
  'select qmonth2, tag1, sum1
  from public."chartdata_chart3"
  ') AS ct(qmonth2 text, name1 int, name2 int, name3 int;

Выход:

 qmonth2 | name1 | name2 | name3
---------+-------+-------+-------
 MAY     | -166  | -86   | 35
 JUN     | -102  | -32   | -75
 AVG     | -135  | -52   | -17

См. руководство для получения дополнительной информации и примеров того, как crosstab работает.

Кроме того, помните, что присвоение имен столбцам / таблицам в кавычках усложняет написание каждого SQL-запроса, поэтому вам лучше не делать этого:)

...