/ / SQL: "Reverse" transponiert eine Tabelle - sql, postgresql, pivivot

SQL: "Reverse" transponiert eine Tabelle - sql, postgresql, pivivot

Ich habe viele Fragen zur Umsetzung von unten stehender Tabelle gesehen ...

scanid | region | volume
-------------------------
1          A      34.4
1          B      32.1
1          C      29.1
2          A      32.4
2          B      33.2
2          C      35.6

zu diesem Tisch.

scanid | A_volume | B_volume | C_volume
----------------------------------------
1        34.4         32.1      29.1
2        32.4         33.2      35.6

Allerdings muss ich das Gegenteil tun, und habe Mühe, meinen Kopf um dieses Problem zu wickeln. Kann jemand helfen?

Vielen Dank.

Antworten:

1 für die Antwort № 1

Sie können dies sehr einfach mit einer UNION-Klausel tun:

Select Scan_ID, "A" as Region, A_Volume as volume
union all
Select Scan_ID, "B" as Region, B_Volume as volume
union all
Select Scan_ID, "C" as Region, C_Volume as volume

2 für die Antwort № 2

Es ist nicht klar, wie Sie "A", "B", "C" -Werte wiederherstellen, also füge ich sie einfach hinzu

bereiten:

t=# create table s188 (scanid int,a float, b float,c float);
CREATE TABLE
t=# insert into s188 select 1,2,3,4;
INSERT 0 1
t=# insert into s188 select 2,12,13,14;
INSERT 0 1
t=# select * from s188;
scanid | a  | b  | c
--------+----+----+----
1 |  2 |  3 |  4
2 | 12 | 13 | 14
(2 rows)

wählen:

t=# with a as (
select scanid,unnest(array[a,b,c]) from s188
)
select scanid,chr((row_number() over (partition by scanid))::int + 64),unnest
from a;
scanid | chr | unnest
--------+-----+--------
1 | A   |      2
1 | B   |      3
1 | C   |      4
2 | A   |     12
2 | B   |     13
2 | C   |     14
(6 rows)

und sauberere Lösung von a_horse_with_no_name

t=# with a as (
select scanid, x.*
from s188, unnest(array[a,b,c]) with ordinality as x(volume,idx)
)
select scanid,
chr(idx::int + 64) as region,
volume
from a;
scanid | region | volume
--------+--------+--------
1 | A      |      2
1 | B      |      3
1 | C      |      4
2 | A      |     12
2 | B      |     13
2 | C      |     14
(6 rows)