如何将 2 行或更多行的数据添加到 postgresql 中的一行

Posted

技术标签:

【中文标题】如何将 2 行或更多行的数据添加到 postgresql 中的一行【英文标题】:How to add the data from 2 or more rows to one row in postgresql 【发布时间】:2013-06-12 10:51:24 【问题描述】:

我有Postgresql 9.2,想知道如何对这个查询进行分组,以便我们只获得一个用户,并希望按 app_user2group_item_ex.user_id 或 app_user.id 分组,这样我得到的不是 6 行,而是 3(一行每个 user_id),日本、美国和新加坡列中的数据就像在希望的结果中列出的一样。

有人可以告诉我如何按照 app_user.id 使用 Group By 来执行此操作吗?我得到一个信息,所有其他带有数字的列都必须添加到 Group By or Agregate

如果我是 postgresql 的新手,可以得到一些关于这个特定案例的信息。

SELECT 
    group_ex2group_item_ex.group_ex, 
    group_ex2group_item_ex.items_id, 
    group_ex.id, 
    group_ex.name, 
    group_ex.group_id, 
    group_item_ex.id, 
    group_item_ex.name, 
    group_item_ex.group_id, 
    app_user.first_name, 
    app_user.id, 
    app_user2group_item_ex.user_id, 
    app_user2group_item_ex.group_item_id,
    (CASE WHEN group_ex."name" = 'Japan' THEN group_item_ex.name END) AS Japan,
    (CASE WHEN group_ex."name" = 'USA' THEN group_item_ex.name END) AS USA,
    (CASE WHEN group_ex."name" = 'Singapore' THEN group_item_ex.name END) AS Singapore
FROM 
    public.group_ex, 
    public.group_ex2group_item_ex, 
    public.group_item_ex, 
    public.app_user, 
    public.app_user2group_item_ex
WHERE 
    group_ex2group_item_ex.group_ex = group_ex.id AND
    group_ex2group_item_ex.items_id = group_item_ex.id AND
    group_item_ex.group_id = group_ex.group_id AND
    app_user.id = app_user2group_item_ex.user_id AND
    app_user2group_item_ex.group_item_id = group_item_ex.id;

查询结果:

group_ex    items_id    id  name    group_id    id  name    group_id    first_name  id  user_id group_item_id   Japan   USA Singapore
1   1   1   Japan   1   1   Nagoya  1   Will    1   1   1   Nagoya      
1   2   1   Japan   1   2   Kyoto   1   Novak   3   3   2   Kyoto       
2   3   2   USA 2   3   New York    2   Will    1   1   3       New York    
2   4   2   USA 2   4   Los Angeles 2   Bos 2   2   4       Los Angeles 
3   5   3   Singapore   3   5   Pudong  3   Bos 2   2   5           Pudong
3   6   3   Singapore   3   6   Center  3   Novak   3   3   6           Center

希望的结果(这里没有列出所有字段,因为我不需要它们):

first_name  id  user_id Japan   USA Singapore
Will    1   1   Nagoya  New York    
Novak   3   3   Kyoto       Center
Bos 2   2       Los Angeles Pudong

【问题讨论】:

FWIW,我认为通过使用创建表并插入一些测试数据的脚本设置“SqlFiddle”,您会更快地得到这样的问题的答案。然后,人们所要做的就是编写一个查询来产生您想要的结果。很多人在无法先对其进行测试的情况下,对猜测、发布和“回答”感到害羞。查看sqlfiddle.com(顺便说一句,我与他们没有任何关系)。如果你想看看如何使用它,只需 google 'sqlfiddle site:"***.com"' 谢谢你以后会用这个。 只是让你明白,你在这里没有做错任何事。完全可以接受的问题(实际上比很多好),但据我所见,基于 SqlFiddle 的问题很容易为人们提供帮助,并且似乎可以更快地获得正确答案。 【参考方案1】:

我可以用这个解决这个问题:

选择 app_user.first_name || ' ' ||app_user.last_name 作为用户, app_user.email, app_user.phone_number, app_user.user_role_id, app_user.active, app_user.username, app_user.id, max((CASE WHEN group_ex."name" = 'Japan' THEN group_item_ex.name END)) 作为日本, max((CASE WHEN group_ex."name" = 'USA' THEN group_item_ex.name END)) 作为美国, max((CASE WHEN group_ex."name" = 'Singapore' THEN group_item_ex.name END)) 作为新加坡, app_user_role.id, app_user_role.name 从 group_ex, group_ex2group_item_ex, group_item_ex, 应用程序用户, app_user2group_item_ex, app_user_role 在哪里 group_ex2group_item_ex.group_ex = group_ex.id 和 group_ex2group_item_ex.items_id = group_item_ex.id AND group_item_ex.group_id = group_ex.group_id AND app_user.id = app_user2group_item_ex.user_id AND app_user2group_item_ex.group_item_id = group_item_ex.id AND app_user.user_role_id = app_user_role.id 按 app_user.id、app_user.first_name、app_user_role.id、app_user_role.name 分组 按 app_user.id 排序

【讨论】:

以上是关于如何将 2 行或更多行的数据添加到 postgresql 中的一行的主要内容,如果未能解决你的问题,请参考以下文章

Postgres XL 将数据节点添加到现有集群

如果活动单元格(两行或更多行)位于同一列中,则突出显示单元格

使用 handsontable 是不是可以为特定的行或列动态添加 css 类?

Excel如何根据某列的重新排序而进行整行的移动?

具有超过十亿行的表的 Postgres 性能

如何使数据表行或单元格可点击?