Сводная таблица Postgres с дополнительными столбцами - PullRequest
0 голосов
/ 29 сентября 2019

Мне нужно реализовать сводную таблицу в Postgres, но я понятия не имею, как это сделать.Используемая функция должна быть crosstab(), но я не уверен, что знаю, как правильно ее использовать.

Учитывая таблицу, подобную этой:

column a | column b | column c | value 1 | value 2

       0 |
       1 |
       2 |
       3 |
       4 |

Я должен получитьчто-то вроде этого:

column c | Column b | 0     | 1     | 2     | 3     | 4 

         |          |value 1|value 1|value 1|value 1|value 1|
         |          |

Поэтому мне нужно получить строки 0, ..., 4 в виде столбцов и value 1 в качестве значений.crosstab() функция хочет 3 столбца, гайка мне нужно, чтобы column c и column b оба появились.

1 Ответ

1 голос
/ 29 сентября 2019

"column c" и "column b" - это так называемые «лишние» столбцы.Поместите их после имени строки и перед категорией:

SELECT * FROM crosstab(
      'SELECT "column a", "column c", "column b"
              ,"value 2", "value 1"
       FROM   tbl
       ORDER  BY 1'
     , 'VALUES (0), (1), (2), (3), (4)'
   ) AS ct (
    "column a" text
  , "column c" text
  , "column b" text
  , "0" int
  , "1" int
  , "2" int
  , "3" int
  , "4" int);

Для адресации вашего комментария:
Это вложенные числовые литералы, которые не нужно заключать в кавычки:

     , 'VALUES (0), (1), (2), (3), (4)'

Строка литералы требуют кавычек (сейчас я использую кавычки для внешней цитаты):

     , $$VALUES ('V0'), ('V1'), ('V2'), ('V3'), ('V4')$$

Или:

     , $$SELECT unnest('{V0,V1,V2,V3,V4}'::text[])$$

db <> fiddle здесь

См .:

О crosstab():

... с дополнительными столбцами:

И рассмотрите вменяемые имена столбцов.(Предполагая, что данные имена являются просто символическими.)

...