/ / SQL: "Reverse" transponuj tabelę - sql, postgresql, unpivot

SQL: "Reverse" transponuj tabelę - sql, postgresql, unpivot

Widziałem wiele pytań dotyczących transpozycji z poniższej tabeli ...

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

do tego stołu.

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

Jednak muszę zrobić odwrotność i mieć kłopot próbujący objąć moją głowę wokół tego problemu. Czy ktoś może pomóc?

Dziękuję Ci.

Odpowiedzi:

1 dla odpowiedzi № 1

Można to zrobić po prostu za pomocą klauzuli UNION:

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 dla odpowiedzi nr 2

nie jest jasne, jak przywrócić wartości "A", "B", "C", więc po prostu je dodaję

przygotować:

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)

Wybierz:

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)

i bardziej schludne rozwiązanie od 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)