Sql 如何按产品获得不同的价格,每种产品只有一行
订单包含不同价格的相同产品 如何按顺序获得每个产品的不同价格列表,每个产品一行 我试过了Sql 如何按产品获得不同的价格,每种产品只有一行,sql,postgresql,distinct,aggregate-functions,string-aggregation,Sql,Postgresql,Distinct,Aggregate Functions,String Aggregation,订单包含不同价格的相同产品 如何按顺序获得每个产品的不同价格列表,每个产品一行 我试过了 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 DIS
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
这可能是为创建答案所必需的
鉴于您的错误消息,以及@GordonLinoff等大师的建议,您不能在
字符串中使用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
我在Postgres上测试了这个查询,它返回以下结果:
product | string_agg
text | text
A | 100,200
B | 200
price是orderdetail表中的第二列::text是postgres cast,它将其类型更改为text以获取字符串price list。在标准SQL中,它可能写为cast(价格为文本)
当您说“如何按顺序获取每个产品的不同价格列表?”时,您的意思是每种产品一行吗?是的,每种产品一行包含按升序排列的不同价格列表。第二列也可以是数组而不是字符串谢谢,它可以工作。我希望这有一些本地语法。