使用第三列的前置值聚合内部联接列

时间:2014-11-13 07:37:54

标签: sql postgresql concatenation aggregate-functions

我有三张桌子。潜在客户,笔记和用户。

leads
- id
- name

notes
- id
- lead_id
- content
- user_id

users
- id
- name

我想构建一个返回带有两列

的新表的查询
Lead name | Notes
John      | Mary - Note 1 ### John - Note 2

第一栏很简单。每个领导都有一个名字。然而,第二栏是一个棘手的问题。我希望将所有笔记汇总到单个列,并添加前面注释作者的姓名。

我用第二列写了一个包含聚合笔记的查询。

 SELECT leads.name AS name,
        string_agg(notes.content, ' ### ') AS leads_notes,
 FROM leads
 INNER JOIN notes ON notes.lead_id = leads.id
 GROUP BY leads.id

但是注意作者姓名(users.name)我不知道如何查询。

1 个答案:

答案 0 :(得分:1)

您的报价具有误导性。单引号不适用于标识符 你的连接也是扭曲的。您无法直接将用户加入潜在客户。 leads没有user_id ...

SELECT ls.name
      , string_agg(concat_ws(' - ', u.name, n.content)
                  , ' ### ') AS leads_notes
FROM   leads l
JOIN   notes n ON n.lead_id = l.id
JOIN   users u ON u.id = n.user_id
GROUP  BY l.id;

修正了基本结构。

在与name聚合之前,将contentstring_agg()concat_ws()(来自同一行的多个值)连接起来(多个值跨行)。

如果定义了users.namenotes.content NOT NULL,则可以改为连接:

u.name || ' - ' || n.content

详细说明:

您还可能希望以非任意方式为每个潜在客户订购元素:

string_agg( ... ORDER BY u.name, u.id)