Как сделать поворот в PostgreSQL

Я новичок в PostgreSQL.

Предположим, у меня есть таблица под

colorname   Hexa    rgb rgbvalue
Violet  #8B00FF r   139
Violet  #8B00FF g   0
Violet  #8B00FF b   255
Indigo  #4B0082 r   75
Indigo  #4B0082 g   0
Indigo  #4B0082 b   130
Blue    #0000FF r   0
Blue    #0000FF g   0
Blue    #0000FF b   255

Если я сделаю сводку в SQL Server как

SELECT colorname,hexa,[r], [g], [b]
FROM
(SELECT colorname,hexa,rgb,rgbvalue
    FROM tblPivot) AS TableToBePivoted
PIVOT
(
sum(rgbvalue)
FOR rgb IN ([r], [g], [b])
) AS PivotedTable;

Я получаю результат как

colorname   hexa    r   g   b
Blue    #0000FF 0   0   255
Indigo  #4B0082 75  0   130
Violet  #8B00FF 139 0   255

Как сделать то же самое с PostgreSQL?

Моя попытка

SELECT *
FROM crosstab
(
    'SELECT 
        colorname
        ,hexa
        ,rgb
        ,rgbvalue
    FROM tblPivot'
)AS ct(colorname text, hexa text, rgb text, rgbvalue int);

Но получаю ошибку:

ERROR:  function crosstab(unknown) does not exist
LINE 2: FROM crosstab
             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
********** Error **********
ERROR: function crosstab(unknown) does not exist**

Есть ли какой-нибудь элегантный способ сделать это в PostgreSQL (любая встроенная функция ...) Какова стандартная практика?


person priyanka.sarkar    schedule 27.09.2011    source источник


Ответы (2)


Это можно выразить как СОЕДИНЕНИЕ:

SELECT c.colorname, c.hexa, r.rgbvalue, g.rgbvalue, b.rgbvalue
FROM (SELECT colorname, hexa
      FROM sometable
      GROUP BY colorname) c
JOIN sometable r ON c.colorname = r.colorname AND r.rgb = 'r'
JOIN sometable g ON c.colorname = g.colorname AND g.rgb = 'g'
JOIN sometable b ON c.colorname = b.colorname AND b.rgb = 'b'
;
person SingleNegationElimination    schedule 27.09.2011
comment
Но почему кросс-таблица не работает ... разве она не поддерживается в текущей версии, которую я использую? - person priyanka.sarkar; 27.09.2011
comment
crosstab() принадлежит модулю tablefunc. Вам нужно будет включить его с помощью CREATE EXTENSION. Тем не менее; удобство, которое он предлагает, может быть не таким уж большим; postgresql фантастически хорош в оптимизации объединений, и такой код будет более узнаваемым в большем количестве баз данных и для большего числа разработчиков. - person SingleNegationElimination; 27.09.2011
comment
Если вы делаете МНОГО перекрестных таблиц, модуль tablefunc contrib может быть отличным. Если вы используете Ubuntu, вы можете добавить функции tablefunc в базу данных, выполнив следующие действия: psql dbname -f /usr/share/postgresql/8.4/contrib/tablefunc.sql или что-то подобное. - person Scott Marlowe; 27.09.2011
comment
Я думаю, что первая строка должна быть вместо этого SELECT c.colorname, c.hexa, r.rgbvalue, g.rgbvalue, b.rgbvalue, но в противном случае +1 для этого ответа. - person plang; 29.09.2011

Запустите это

CREATE EXTENSION tablefunc;

и попробуйте выполнить ваш запрос

person Laxmikant Dange    schedule 21.08.2013
comment
если я запускаю это, я получаю ERROR: extension "tablefunc" already exists, но когда я пытаюсь его использовать, я получаю ERROR: function crosstab(unknown) does not exist. Я использую Postgres 9.2.1 на Mac 10.9.2. Любые идеи? - person Black; 15.04.2014
comment
Убедитесь, что вы подключены к своей базе данных с помощью \ c db_name, а затем выполните указанную выше команду. - person sm0ke21; 15.05.2014
comment
Этот ответ содержит ответ на вопрос, поднятый в комментарии @ Black. - person Andrew-Dufresne; 16.09.2017