Как развернуть или перекрестную таблицу в postgresql без написания функции? - PullRequest
0 голосов
/ 11 мая 2018

У меня есть набор данных, который выглядит примерно так:

gotta pivot

Я бы хотел собрать все значения co в одной строке, поэтому конечный результат будет выглядеть примерно так:

enter image description here

Кажется, довольно легко, верно? Просто напишите запрос, используя crosstab, как предложено в этот ответ . Проблема заключается в том, что я CREATE EXTENSION tablefunc; и у меня нет прав на запись в мою БД.

Кто-нибудь может порекомендовать альтернативу?

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Вы можете использовать DO для генерации и ПОДГОТОВИТЬ свой SQL со столбцами кросс-таблицы, затем ВЫПОЛНИТЬ it.

-- replace tab_name to yours table name

DO $$
DECLARE
  _query text;
  _name text;
BEGIN
  _name := 'prepared_query';
  _query := '
    SELECT co
        '||(SELECT ', '||string_agg(DISTINCT 
                    ' string_agg(DISTINCT 
                                CASE ontology_type WHEN '||quote_literal(ontology_type)||' THEN tags 
                                ELSE NULL 
                                END, '',''
                                ) AS '||quote_ident(ontology_type),',') 
            FROM tab_name)||'
    FROM tab_name
    GROUP BY co
    ';

    BEGIN
        EXECUTE 'DEALLOCATE '||_name;
    EXCEPTION
        WHEN invalid_sql_statement_name THEN
    END;

    EXECUTE 'PREPARE '||_name||' AS '||_query;
END
$$;

EXECUTE prepared_query;
0 голосов
/ 14 мая 2018

Используя pivot, мы также можем достичь требуемого результата

SELECT co
    ,industry
    ,customer_type
    ,product_type
    ,sales_model
    ,stage
FROM dataSet
PIVOT(max(tags) FOR ontologyType IN (
            industry
            ,customer_type
            ,product_type
            ,sales_model
            ,stage
            )) AS PVT
0 голосов
/ 11 мая 2018

Условное агрегирование:

SELECT co,
  MIN(CASE WHEN ontology_type = 'industry' THEN tags END) AS industry,
  MIN(CASE WHEN ontology_type = 'customer_type' THEN tags END) AS customer_type, 
  -- ...
FROM tab_name
GROUP BY co
...