我在PostgreSQL中有以下查询:
SELECT sale_order.id,sale_order.name AS orden, now()::date AS hoy,
sale_order.create_date::date, split_part(res_partner.name,' ',1) AS cliente,
res_partner.email,sale_order.amount_total,res_currency.name FROM
sale_order,product_pricelist,res_currency,res_partner WHERE
sale_order.partner_id = res_partner.id
AND sale_order.pricelist_id = product_pricelist.id
AND product_pricelist.currency_id = res_currency.id
AND sale_order.state = 'sent'
ORDER BY sale_order.create_date DESC;
,结果集如下所示:
658, SO658, 2015-05-17, 2015-04-16, Alejandro, some@email.com, 14272.00, MXN
654, SO654, 2015-05-17, 2015-04-15, Edgar, one@email.com, 4994.96, MXN
653, SO653, 2015-05-17, 2015-04-15, Edgar, one@email.com, 3007.29, USD
正如您所看到的,第2和第3条记录在某种程度上是重复的,不知何故因为它是相同的用户,但具有不同的ID,订单名称,日期等。
我想做的是忽略日期和金额但忽略GROUP_CONCAT订单名称,所以最终结果如下:
SO658, Alejandro, some@email.com
SO653 & SO654, Edgar, one@email.com
正如您所看到的,我删除了不必要的列和GROUP_CONCAT属于同一用户的订单名称,因此最终每个用户只有一条记录显示其所有订单名称。
我如何在PostgreSQL中执行此操作?
谢谢!
答案 0 :(得分:2)
在没有表定义或SQL小提琴的情况下尝试查询有点困难,但是:
您可以GROUP BY
cliente
和email
,然后使用array_agg
,这将返回ARRAY
。如果你真的想要一个字符串,你可以使用string_agg(sale_order.name, ' & ')
,但数组通常更容易使用。
SELECT array_agg(sale_order.name) AS orden,
split_part(res_partner.name,' ',1) AS cliente,
res_partner.email
FROM sale_order,product_pricelist,res_currency,res_partner
WHERE sale_order.partner_id = res_partner.id
AND sale_order.pricelist_id = product_pricelist.id
AND product_pricelist.currency_id = res_currency.id
AND sale_order.state = 'sent'
GROUP BY cliente, email;