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 테이블의 두 번째 열입니다 : 텍스트 문자열 가격 목록을 얻으려면 텍스트 유형을 변경하는 주조 포스트 그레스입니다. 표준 SQL에'cast (price as text)'로 쓰여질 수 있습니다 – Andrus

+1

'제품 별 고유 가격 목록을 얻는 방법'이라고 할 때, 제품 하나당 하나의 행을 의미합니까? –

+0

예, 제품별로 가격이 다른 목록을 포함하는 단일 행을 오름차순으로 표시합니다. 두 번째 열은 문자열 대신 배열이 될 수도 있습니다 – Andrus

답변

2

에 대한 답을 작성하는 데 필요한, 그리고 what I read here on Stack Overflow에서 @GordonLinoff 같은 지도자에서, 당신은 STRING_AGG 내부 DISTINCT을 사용할 수 없습니다. 빠른 해결 방법은 먼저 테이블을 하위 쿼리로 만들고 중복을 제거하기 위해 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 

나는 포스트 그레스에이 쿼리를 테스트하고,이 반환

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

고맙습니다. 작동합니다. 나는 이것을위한 원시 구문이있을 것으로 예상했다. – Andrus

관련 문제