【问题标题】:Turning rows to columns in postgres在 postgres 中将行转换为列
【发布时间】:2021-12-03 17:02:43
【问题描述】:

我有一张带有租赁合同的桌子。 (Postgres v10.18)

像这样:

Table Rental
Id          Start       Main_tenant_id  Obect_id
101011          1.1.2021    1000            200
100222          1.1.2021    2050            210

如果对象有多个租户,则其他租户保存在单独的表中,如下所示:

Table Rental_extra
Id          rental_id   xtra_tenant
20001           100222      3000
20002           100222      2700
20003           100222      2800

我有一个像这样的 Person 表:

Table Person
Id          first_name      last_name
1000            Peter           Mcdonald
2050            Dan         Hunt
3000            Steve           Cole
2700            Ian         Wright
2800            William         Pears

现在我需要得到这个输出:

Goal
Id      tenant 1        tenant 2        tenant 3        tenant 4
101011      Peter Mcdonald  null            null            null
100222      Dan Hunt        Steve Cole      Ian Wright      William Pears

最好的方法是什么?我尝试了一些交叉表示例,但无法使其工作。

【问题讨论】:

  • 我们非常喜欢将数据作为 文本。无法从图像复制/粘贴。
  • @ErwinBrandstetter 感谢输入,我现在编辑了问题。

标签: sql postgresql pivot crosstab


【解决方案1】:
SELECT *
FROM   crosstab(
$$
SELECT t.id, tenant_nr, concat_ws(' ', p.first_name, p.last_name)
FROM  (
   SELECT id, 0 AS tenant_nr, main_tenant_id AS tenant_id
   FROM   rental
   UNION ALL
   SELECT rental_id, row_number() OVER (PARTITION BY rental_id ORDER BY id), xtra_tenant
   FROM   extra_tenant 
   ) t
JOIN   person p ON p.id = t.tenant_id
ORDER  BY 1 DESC, t.tenant_nr
$$
) AS goal(id int, tenant_1 text, tenant_2 text, tenant_3 text, tenant_4 text);

db小提琴here

这里有详细解释:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    相关资源
    最近更新 更多