【问题标题】:Convert wide format data to long format using SQL使用 SQL 将宽格式数据转换为长格式
【发布时间】:2021-07-20 00:30:20
【问题描述】:

我最近开始使用 SQL 进行数据操作。所以,如果这太基本了,请原谅我。 我有以下格式的数据表1。

id  pg_a  pg_b
12   1     0
35   1     1
46   0     1

我想将其转换为如下表所示的长格式。

id  pg  value
12  a     1
12  b     0
35  a     1
35  b     1
46  a     0
46  a     1

我有一个使用 case when 的 sql 查询,但是运气不好。查询仅在两个 case 语句中执行第一个。

这是查询:

select id,
(case when pg_a is not null then pg_a
     when pg_b is not null then pg_b
     else null 
 end) AS pg,
(case when pg_a is not null then a
      when pg_b is not null then b
      else null
 end) AS value
from table1

我需要做些什么不同的事情?任何指针将不胜感激。

提前谢谢你。

【问题讨论】:

    标签: sql postgresql data-manipulation


    【解决方案1】:

    您可以使用横向连接:

    select t.id, v.*
    from t cross join lateral
         (values ('a', pg_a), ('b', pg_b)
         ) v(pg, value);
    

    如果您是 SQL 新手,您可能会更熟悉union all

    select id, 'a' as pg, pg_a as value
    from t
    union all
    select id, 'b', pg_b
    from t;
    

    【讨论】:

    • 谢谢戈登。与联合的查询有效。至于横向连接,我不明白 v.* 做了什么。我正在查找它。性能方面,横向连接比使用联合更有效吗?再次感谢您的帮助。
    • 既然戈登的回答解决了你的问题,你应该接受它。这有助于未来的提问者解决同样的问题。请不要留下一个成功回答的问题。
    • @savi 。 . . v.* 选择 v 中的所有列。是的,横向连接比union all 更快,因为它只扫描表一次。除非表很大或者确实是一个复杂的查询(比如视图或 CTE),否则这几乎没有影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多