un-pivot with crosstab?

From: Kirk Wythers <kwythers(at)umn(dot)edu>
To: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: un-pivot with crosstab?
Date: 2013-01-02 17:16:39
Message-ID: CF72445B-D8C7-40A7-85C2-3BFFB38C74B1@umn.edu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

I am trying to follow the example given below, but in reverse. I have something like table2, that I am trying to "un-pivot" to look like table1… And I seem to be having a booger of a time.

My attempt:

SELECT * FROM crosstab(
'SELECT rowid, key1,key1
FROM test WHERE key1= ''value'' OR key2 = ''value''
ORDER BY 1,2'
) AS ct(rowid text, value int8);

Can anyone point out where my small brain is failing me?

PostgreSQL crosstab query - Rotate a table about a pivot
An interesting feature of relational databases(postgres in this case) is the ability to rotate the table about a pivot. So if you have data like this-
id | rowid | key | value
---+------+----+-------
1 | test1 | key1 | val1
2 | test1 | key2 | val2
3 | test1 | key3 | val3
4 | test1 | key4 | val4
5 | test2 | key1 | val5
6 | test2 | key2 | val6
7 | test2 | key3 | val7
8 | test2 | key4 | val8

And want to have a result set like this -

rowid | key1 | key2 | key3 | key4
------+------+-----+-----+------
test1 | val1 | val2 | val3 | val4
test2 | val5 | val6 | val7 | val8

It can be achieved by a "crosstab" query in a postgres database -

SELECT * FROM crosstab(
'SELECT rowid, key, value
FROM test WHERE key= ''key1'' OR key = ''key2''
OR key = ''key3'' OR key = ''key4''
ORDER BY 1,2'
) AS ct(rowid text, key1 text, key2 text,
key3 text, key4 text);

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Abraham, Danny 2013-01-02 19:08:27 Query fluctuates .... Strange strange .....
Previous Message ERR ORR 2013-01-02 17:04:47 Fwd: Question on Trigram GIST indexes