将键值对转换回普通表

问题描述 投票:0回答:1

我的老板要求我将表转换为键值对。所以而不是

id a  b  c
1  a1 b1 c1
2  a2 b2 c2
3  a3 b3 c3

我们有

id col val
1  a   a1
1  b   b1
1  c   c1
2  a   a2
2  b   b2
2  c   c2
3  a   a3
3  b   b3
3  c   c3

现在我的问题是是否可以编写一条SQL语句将后一个表转换回前一个表。我的猜测是这是不可能的。但如果我告诉我的老板,我会冒犯他吗?

sql key-value
1个回答
1
投票

您可以使用

MAX
val
列旋转为三个单独的列(a、b 和 c),具体取决于
col
列中的值:

CREATE TABLE transformed (
  id INT,
  col CHAR(1),
  val VARCHAR(255)
);

INSERT INTO transformed (id, col, val) VALUES
(1, 'a', 'a1'),
(1, 'b', 'b1'),
(1, 'c', 'c1'),
(2, 'a', 'a2'),
(2, 'b', 'b2'),
(2, 'c', 'c2'),
(3, 'a', 'a3'),
(3, 'b', 'b3'),
(3, 'c', 'c3');

SELECT 
  id,
  MAX(CASE WHEN col = 'a' THEN val END) AS a,
  MAX(CASE WHEN col = 'b' THEN val END) AS b,
  MAX(CASE WHEN col = 'c' THEN val END) AS c
FROM transformed
GROUP BY id;

输出:

id  a   b   c
1   a1  b1  c1
2   a2  b2  c2
3   a3  b3  c3

尝试使用 SQL Fiddle

© www.soinside.com 2019 - 2024. All rights reserved.