各位,请教一个蠢问题, PostgreSQL 列转换成行的 SQL 写法,网上看了半天没看懂

2022-03-23 19:42:50 +08:00
 0x0208v0

目标表结构:

姓名 日期 语文 数学 英语
小明 2022-01-01 1 2 3
小明 2022-01-02 4 5 6
小红 2022-01-01 11 22 33
小红 2022-01-02 44 55 66

想要转换成下面:

姓名 日期 学科 分数
小明 2022-01-01 语文 1
小明 2022-01-01 数学 2
小明 2022-01-01 英语 3
小明 2022-01-02 语文 4
小明 2022-01-02 数学 5
小明 2022-01-02 英语 6
小红 2022-01-01 语文 11
小红 2022-01-01 数学 22
小红 2022-01-01 英语 33
小红 2022-01-02 语文 44
小红 2022-01-02 数学 55
小红 2022-01-02 英语 66

自己想了半天,不知道用 PG 写出 SQL 是什么样的,请各位有经验的大佬们指点一下,

哪怕是回答一个 PG 用的函数,在此谢过

1155 次点击
所在节点    问与答
6 条回复
fuyufjh
2022-03-23 19:44:55 +08:00
写个 select 然后 union all 起来
fuyufjh
2022-03-23 19:45:29 +08:00
更正:写 3 个 select 然后 union all 起来
0x0208v0
2022-03-23 19:50:50 +08:00
@fuyufjh
```
select 姓名, 日期, "学科", 数学 from table1
union
select 姓名, 日期, "学科", 语文 from table1
union
select 姓名, 日期, "学科", 英语 from table1
```

不会要这么写吧,确实能实现 :doge:
zbinlin
2022-03-23 20:24:08 +08:00
moen
2022-03-23 20:28:14 +08:00
SELECT "姓名", "日期",
unnest(ARRAY['语文', '数学', '英语']) AS "学科",
unnest(ARRAY["语文", "数学", "英语"]) AS "分数"
FROM LATERAL (VALUES
('小明', '2022-01-01'::date, 1, 2, 3),
('小明', '2022-01-02'::date, 4, 5, 6),
('小红', '2022-01-01'::date, 11, 22, 33),
('小红', '2022-01-02'::date, 44, 55, 76))
scores("姓名", "日期", "语文", "数学", "英语")
ORDER BY 1, 2
isir1234
2022-03-23 23:07:37 +08:00
create extension hstore;

SELECT 姓名, 日期, (x).key, (x).value
FROM (SELECT 姓名, 日期, each(hstore(分数表) - ARRAY ['姓名', '日期']) as x FROM 分数表) tmp;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/842447

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX