I am trying to flip columns and rows using SQL. I've looked up and trialled a few options from older stackoverflow questions, but haven't been able to successfully apply it to my table.
I have a table ("Count Shifts") such as the following:
Shift,day1,day2,day3,...,day30
D,133,123,16,...,124
N,12,3,15,...,4
X,2,4,5,...,6
F,25,32,32,...,64
C,1,3,0,...,1
I want to flip it to:
Day,D,N,X,F,C
day1,133,12,2,25,1
day2,123,3,4,32,3
day3,16,15,5,32,0
...
day30,124,4,6,64,1
I've been trying to use the following:
SELECT 'SELECT *
FROM crosstab(
$ct$SELECT u.attnum, t.rn, u.val
FROM (SELECT row_number() OVER () AS rn, * FROM '
|| attrelid::regclass || ') t
, unnest(ARRAY[' || string_agg(quote_ident(attname)
|| '::text', ',') || '])
WITH ORDINALITY u(val, attnum)
ORDER BY 1, 2$ct$
) t (attnum bigint, '
|| (SELECT string_agg('r'|| rn ||' text', ', ')
FROM (SELECT row_number() OVER () AS rn FROM "COUNT SHIFTS") t)
|| ')' AS sql
FROM pg_attribute
WHERE attrelid = 'COUNT SHIFTS'::regclass
AND attnum > 0
AND NOT attisdropped
GROUP BY attrelid;
From this thread, but couldn't make it work.
Any advice is appreciated!!
EDIT: this is the error message I get from trying that query:
Error: Failed to execute query "SELECT 'SELECT *
FROM crosstab(
$ct$SELECT u.attnum, t.rn, u.val
FROM (SELECT row_number() OVER () AS rn, * FROM '
|| attrelid::regclass || ') t
, unnest(ARRAY[' || string_agg(quote_ident(attname)
|| '::text', ',') || '])
WITH ORDINALITY u(val, attnum)
ORDER BY 1, 2$ct$
) t (attnum bigint, '
|| (SELECT string_agg('r'|| rn ||' text', ', ')
FROM (SELECT row_number() OVER () AS rn FROM "COUNT SHIFTS") t)
|| ')' AS sql
FROM pg_attribute
WHERE attrelid = '"COUNT SHIFTS"'::regclass
AND attnum > 0
AND NOT attisdropped
GROUP BY attrelid;" Failed to Parse Query SELECT * FROM (SELECT 'SELECT *
FROM crosstab(
$ct$SELECT u.attnum, t.rn, u.val
FROM (SELECT row_number() OVER () AS rn, * FROM '
|| attrelid::regclass || ') t
, unnest(ARRAY[' || string_agg(quote_ident(attname)
|| '::text', ',') || '])
WITH ORDINALITY u(val, attnum)
ORDER BY 1, 2$ct$
) t (attnum bigint, '
|| (SELECT string_agg('r'|| rn ||' text', ', ')
FROM (SELECT row_number() OVER () AS rn FROM "COUNT SHIFTS") t)
|| ')' AS sql
FROM pg_attribute
WHERE attrelid = '"COUNT SHIFTS"'::regclass
AND attnum > 0
AND NOT attisdropped
GROUP BY attrelid;) AS T LIMIT 50
line 5:43 no viable alternative at input '(SELECT'SELECT *\nFROM crosstab(\n $ct$SELECT u.attnum, t.rn, u.val\n FROM (SELECT row_number() OVER () AS rn, * FROM 'attrelidregclass'
Component: Extended Error Display
Method: View More Info