首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将行连接并转到红移中的列

如何将行连接并转到红移中的列
EN

Stack Overflow用户
提问于 2021-12-09 00:14:15
回答 1查看 684关注 0票数 1

我遵循table1,它的唯一键是type

代码语言:javascript
复制
type age
A     20
B     21
C     22

我有下面的结果表。我想加入他们

代码语言:javascript
复制
type score
A     10
A     20
A     30
B     40 
B     50

跟随转位的形式。

代码语言:javascript
复制
type  age  score score score
A     20    10    20    30
B     21    40    50    na
C     22    na    na    na

有办法做到这一点吗?

代码语言:javascript
复制
select *
from table1
left join table2 usint(type)

没有转行。如果有人有意见,请告诉我,谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-01-13 10:26:53

如果您不预先知道每种类型的score值的数量,那么您需要一个完整的动态解决方案:

首先,根据new_type中每个类型的score值的最大值创建一个复合类型table2。然后,该复合类型用于在最终查询中命名列。

代码语言:javascript
复制
CREATE OR REPLACE PROCEDURE new_type() LANGUAGE plpgsql AS
$$
DECLARE
  column_txt text ;
BEGIN
  SELECT string_agg(' score' || id || ' integer', ',')
   INTO column_txt
    FROM
       (  SELECT count(*) AS count
           FROM table2
          GROUP BY type
          ORDER BY 1 DESC
          LIMIT 1
       ) AS a
   CROSS JOIN LATERAL generate_series(1, a.count :: integer) AS id ;
     
  EXECUTE 'DROP TYPE IF EXISTS new_type' ;
  EXECUTE 'CREATE TYPE new_type AS (' || column_txt || ')' ;
END ;
$$ ;

CALL new_type() ;

然后,这个查询将提供预期的结果:

代码语言:javascript
复制
SELECT c.type, c.age
     , (jsonb_populate_record( NULL :: new_type
                             , jsonb_object_agg('score' || c.id, c.score ORDER BY c.score)
                             )).*
  FROM 
     ( SELECT a.type, a.age, b.score, row_number() OVER (PARTITION BY a.type, a.age ORDER BY b.score) AS id
         FROM table1 AS a
         LEFT JOIN table2 AS b
           ON a.type = b.type
     ) AS c
 GROUP BY c.type, c.age
 ORDER BY c.type, c.age

测试结果在[医]小提琴中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70283260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档