2015-05-17 31 views
2

類似記錄我有PostgreSQL中以下查詢:GROUP_CONCAT在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, [email protected], 14272.00, MXN 
654, SO654, 2015-05-17, 2015-04-15, Edgar, [email protected], 4994.96, MXN 
653, SO653, 2015-05-17, 2015-04-15, Edgar, [email protected], 3007.29, USD 

正如你所看到的,第二和第三記錄是以某種方式重複,不知何故,因爲它是相同的用戶,但具有不同的編號,訂單名稱,日期等

我想如何做是忽略日期和金額,但GROUP_CONCAT命令南ES,所以最終的結果是這樣的:

SO658, Alejandro, [email protected] 
SO653 & SO654, Edgar, [email protected] 

正如你所看到的,我放棄了不必要的列和GROUP_CONCAT屬於同一用戶的命令名稱,以便在最終每個用戶將只有一個記錄顯示他們的所有訂單名稱。

我該如何在PostgreSQL中做到這一點?

謝謝!

回答

1

這是一個有點硬嘗試不表定義或SQL小提琴查詢,但:

可以GROUP BYclienteemail然後用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; 
+0

我想過使用ARRAY_AGG但我使用的版本8.4版本(CentOS 6.5) –

+1

'ARRAY_AGG()'在8.4推出。另外,請在您的問題中指定您的PostgreSQL版本(特別是在使用舊版本時),人們可以更容易地爲您提供幫助。 – Marth

+0

對不起,這是我的第一個問題。 BTW的任何方式來刪除()該array_agg似乎把每個後面添加一個空格,? –