Dynamically generate columns for crosstab in PostgreSQL

后端 未结 4 525
慢半拍i
慢半拍i 2020-11-27 05:12

I am trying to create crosstab queries in PostgreSQL such that it automatically generates the crosstab columns instead of hardcoding it. I have wri

4条回答
  •  渐次进展
    2020-11-27 05:52

    I realise this is an older post but struggled for a little while on the same issue.

    My Problem Statement: I had a table with muliple values in a field and wanted to create a crosstab query with 40+ column headings per row.

    My Solution was to create a function which looped through the table column to grab values that I wanted to use as column headings within the crosstab query.

    Within this function I could then Create the crosstab query. In my use case I added this crosstab result into a separate table.

    E.g.

    CREATE OR REPLACE FUNCTION field_values_ct ()
     RETURNS VOID AS $$
    DECLARE rec RECORD;
    DECLARE str text;
    BEGIN
    str := '"Issue ID" text,';
       -- looping to get column heading string
       FOR rec IN SELECT DISTINCT field_name
            FROM issue_fields
            ORDER BY field_name
        LOOP
        str :=  str || '"' || rec.field_name || '" text' ||',';
        END LOOP;
        str:= substring(str, 0, length(str));
    
        EXECUTE 'CREATE EXTENSION IF NOT EXISTS tablefunc;
        DROP TABLE IF EXISTS temp_issue_fields;
        CREATE TABLE temp_issue_fields AS
        SELECT *
        FROM crosstab(''select issue_id, field_name, field_value from issue_fields order by 1'',
                     ''SELECT DISTINCT field_name FROM issue_fields ORDER BY 1'')
             AS final_result ('|| str ||')';
    END;
    $$ LANGUAGE plpgsql;
    

提交回复
热议问题