SQL: "Reverse"转置一个表

标签 sql postgresql unpivot

从下表看到很多关于转置的问题...

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

到这个表。

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

但是,我需要做相反的事情,并且无法解决这个问题。谁能帮忙?

谢谢。

最佳答案

不清楚如何恢复“A”、“B”、“C”值,所以我只是添加它们

准备:

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)

选择:

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_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)

关于SQL: "Reverse"转置一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44301337/

相关文章:

mysql - "INNER JOIN"和 "LEFT JOIN"与 "GROUP BY"

php - 使用 Laravel 在 Azure 中来自单个请求的多个重复 HTTP 请求/查询

mysql - connection.select_value 仅使用 pg gem 返回 postgres 中的字符串

sql - Oracle SQL - CASE WHEN THEN ELSE 忽略 ELSE 部分

mysql按子查询结果过滤

java - 插入行时"data exception: division by zero"

sqlite - 将 heroku postgres 数据库复制到本地 sqlite 数据库

sql-server - FROM 子句中的 UNPIVOT 和 JOIN 语法错误

sql - 在单行中获取不同的列值

sql - Oracle 11 SQL : Split 1 row into x rows and insert a new column