/ / SQL: "Reverse" prenesie tabuľku - sql, postgresql, unpivot

SQL: "Reverse" prenesie tabuľku - sql, postgresql, unpivot

Videl som veľa otázok o transpozícii z nižšie uvedenej tabuľky ...

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 tejto tabuľky.

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

Musím však urobiť inverznú situáciu a mám problémy s tým, aby som sa snažil zabrániť tomuto problému. Môže niekto pomôcť?

Ďakujem.

odpovede:

1 pre odpoveď č. 1

Môžete to urobiť veľmi jednoducho pomocou klauzuly 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 pre odpoveď č. 2

nie je jasné, ako obnovíte hodnoty "A", "B", "C", takže ich len pridám

pripraviť:

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)

vyberte:

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)

a čistejšie riešenie 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)