如何将 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 中的一行的主要内容,如果未能解决你的问题,请参考以下文章
如果活动单元格(两行或更多行)位于同一列中,则突出显示单元格