V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
v2exblog
V2EX  ›  问与答

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

  •  
  •   v2exblog · 2022-03-23 19:42:50 +08:00 · 1109 次点击
    这是一个创建于 726 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目标表结构:

    姓名 日期 语文 数学 英语
    小明 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 用的函数,在此谢过

    6 条回复    2022-03-23 23:07:37 +08:00
    fuyufjh
        1
    fuyufjh  
       2022-03-23 19:44:55 +08:00
    写个 select 然后 union all 起来
    fuyufjh
        2
    fuyufjh  
       2022-03-23 19:45:29 +08:00
    更正:写 3 个 select 然后 union all 起来
    v2exblog
        3
    v2exblog  
    OP
       2022-03-23 19:50:50 +08:00
    @fuyufjh
    ```
    select 姓名, 日期, "学科", 数学 from table1
    union
    select 姓名, 日期, "学科", 语文 from table1
    union
    select 姓名, 日期, "学科", 英语 from table1
    ```

    不会要这么写吧,确实能实现 :doge:
    zbinlin
        4
    zbinlin  
       2022-03-23 20:24:08 +08:00
    moen
        5
    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
        6
    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;
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5788 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 03:34 · PVG 11:34 · LAX 20:34 · JFK 23:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.