poprawione / działające
create table pivottable (sql text);
create or replace function pivotcode (tablename varchar, rowc varchar, colc varchar, cellc varchar, celldatatype varchar, wherec varchar) returns void language plpgsql as $$
declare
dynsql1 varchar;
dynsql2 text;
columnlist varchar;
where_c varchar;
begin
if (wherec = '') or (wherec is null) then
where_c = '';
else
where_c = ' where ' || wherec;
end if;
dynsql1 = 'select string_agg(distinct ''_''||'||colc||'||'' '||celldatatype||''','','' order by ''_''||'||colc||'||'' '||celldatatype||''') from '||tablename|| where_c ||';';
execute dynsql1 into columnlist;
dynsql2 = 'select * from crosstab (
''select '||replace(rowc, '''', '''''')||','||replace(colc, '''', '''''')||','||replace(cellc, '''', '''''')||' from '||tablename|| replace(where_c, '''', '''''') || ' group by 1,2 order by 1,2'',
''select distinct '||replace(colc, '''', '''''')||' from '||tablename|| replace(where_c, '''', '''''') || ' order by 1''
)
as newtable (
'||rowc||' varchar,'||columnlist||'
);';
truncate table pivottable;
insert into pivottable values (dynsql2);
end
$$
wywołanie (z wyliczeniem średniej dla dni), ostatni parametr to warunek dla zawężenia danych (może być pusty lub null)
SELECT * from pivotcode('dane_pomiaru','nazwa','to_char(data, ''yyyymmdd'')','AVG(wartosc)','numeric','');
następnie trzeba z tabeli pivottable
(jest tam jeden rekord) skopiować zawartość - to będzie gotowy SQL, który pokaże Ci Twój wynik
tutaj przykładowy wygenerowany kod SQL dla zapytania
SELECT * from pivotcode('dane_pomiaru','nazwa','to_char(data, ''yyyymm'')','AVG(wartosc)','numeric','');
select * from crosstab (
'select nazwa,to_char(data, ''yyyymm''),AVG(wartosc) from dane_pomiaru group by 1,2 order by 1,2',
'select distinct to_char(data, ''yyyymm'') from dane_pomiaru order by 1'
)
as newtable (
nazwa varchar,_201401 numeric,_201402 numeric,_201403 numeric,_201404 numeric,_201405 numeric,_201406 numeric,_201407 numeric,_201408 numeric,_201409 numeric,_201410 numeric,_201411 numeric,_201412 numeric,_201501 numeric,_201502 numeric,_201503 numeric,_201504 numeric,_201505 numeric,_201506 numeric,_201507 numeric,_201508 numeric,_201509 numeric,_201510 numeric,_201511 numeric,_201512 numeric,_201601 numeric,_201602 numeric
);
i efekt uruchomienia zapytania