-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpivotcode.sql
42 lines (31 loc) · 948 Bytes
/
pivotcode.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
CREATE OR REPLACE FUNCTION pivotcode (
tablename VARCHAR,
myrow VARCHAR,
mycol VARCHAR,
mycell VARCHAR,
celldatatype VARCHAR
)
RETURNS VARCHAR
LANGUAGE PLPGSQL AS
$$
DECLARE
dynsql1 VARCHAR;
dynsql2 VARCHAR;
columnlist VARCHAR;
BEGIN
-- 1 retrive list of all DISTINCT column name
-- SELECT DISTINCT(column_name) FROM table_name
dynsql1 = 'SELECT STRING_AGG(DISTINCT ''_''||'||mycol||'||'' '||celldatatype||''','','' ORDER BY ''_''||'||mycol||'||'' '||celldatatype||''') FROM '||tablename||';';
EXECUTE dynsql1 INTO columnlist;
-- 2. setup the crosstab query
dynsql2 = 'SELECT * FROM crosstab (
''SELECT '||myrow||','||mycol||','||mycell||' FROM '||tablename||' GROUP BY 1,2 ORDER BY 1,2'',
''SELECT DISTINCT '||mycol||' FROM '||tablename||' ORDER BY 1''
)
AS newtable (
'||myrow||' VARCHAR,'||columnlist||'
);';
-- 3. return the query
RETURN dynsql2;
END
$$