1

ご注文には価格が異なる同じ商品が含まれています。商品ごとに単列で商品ごとに異なる価格を得る方法

製品ごとに異なる価格のリストを、製品ごとに1行にする方法を教えてください。

私は

SELECT product, string_AGG(DISTINCT price::text, ',' ORDER BY price) 
FROM (VALUES ('A', 100), ('A', 200) , ('B', 200)) 
orderdetail (product, price) 
GROUP BY product 

を試みたが、この問題を解決するためにどのようにエラー

ERROR: in an aggregate with DISTINCT, ORDER BY expressions must appear in argument list 
LINE 1: ...ct, string_AGG(DISTINCT price::text, ',' ORDER BY price DESC... 

を得ましたか。

Postgres 9.4が使用されます。

これはおそらく、あなたのエラーメッセージが与えられ How to find changed prices in last two purchase invoices

+1

価格はorderdetailテーブルに二列である::テキストは文字列の価格リストを取得するにはテキストにそのタイプを変更するキャストはpostgresです。おそらく標準的なSQLで 'cast(price as text)'と書くことができます – Andrus

+1

商品ごとに異なる価格のリストを取得するにはどうすればいいですか? –

+0

はい、異なる価格の商品を含む商品ごとに1行が昇順で表示されます。 2列目はおそらく文字列の代わりに配列にすることもできます – Andrus

答えて

2

のための答えを作成するために必要とされ、what I read here on Stack Overflowから@GordonLinoffのような達人から、あなたはSTRING_AGGDISTINCTを使用することはできません。簡単な回避策は、テーブルを最初にサブクエリしてからDISTINCTを使用して重複を削除することです。

SELECT t.product, STRING_AGG(t.price::text, ',' ORDER BY price) 
FROM 
(
    SELECT DISTINCT product, price 
    FROM (VALUES ('A', 100), ('A', 100), ('A', 200), ('B', 200), ('B', 200)) 
    orderdetail (product, price) 
) t 
GROUP BY t.product 

私はPostgresの上でこのクエリをテストし、そしてそれは、これを返します。

product | string_agg 
text | text 
A  | 100,200 
B  | 200 
+0

ありがとう、それは動作します。私はこのためにいくつかのネイティブ構文があると思いました。 – Andrus

関連する問題