Skip to content

Instantly share code, notes, and snippets.

@schaunwheeler
Created April 14, 2017 01:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save schaunwheeler/f807bec90961370a6d620592ff756262 to your computer and use it in GitHub Desktop.
Save schaunwheeler/f807bec90961370a6d620592ff756262 to your computer and use it in GitHub Desktop.
DROP FUNCTION IF EXISTS pivotcode(varchar, varchar, varchar, varchar, varchar, varchar);
create or replace function pivotcode (tablename varchar, resultname varchar, rowc varchar, colc varchar, cellc varchar, celldatatype varchar)
returns VOID language plpgsql as $$
declare
dynsql1 varchar;
dynsql2 varchar;
columnlist varchar;
begin
-- 1. retrieve list of column names.
dynsql1 = 'select string_agg(distinct ''"''||'||colc||'||''" '||celldatatype||''','','' order by ''"''||'||colc||'||''" '||celldatatype||''') from '||tablename||';';
execute dynsql1 into columnlist;
-- 2. set up the crosstab query
dynsql2 = 'DROP TABLE IF EXISTS pivot_results;
CREATE TEMPORARY TABLE pivot_results AS(
select * from crosstab (
''select '||rowc||','||colc||','||cellc||' from '||tablename||' order by 1,2'',
''select distinct '||colc||' from '||tablename||' order by 1''
) as newtable ('||rowc||' varchar,'||columnlist||')
);'
;
EXECUTE dynsql2;
end
$$
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment