我有一个简单的表格如下:
company_Id user_Id price sub_price
123456 11111 200 NULL
123456 11111 500 NULL
456789 22222 300 NULL
我想通过总结价格来合并将计数(*)> = 2的记录合并为一行,但要记下列sub_price中总结的内容。期望的输出应该如下所示:
company_Id user_Id price sub_price
123456 11111 700 200,500
456789 22222 300 300
有没有简单的方法来实现所需的输出?非常感谢您的帮助。
答案 0 :(得分:1)
您可以使用listagg
将组的元素转换为字符串:
SELECT ...
, LISTAGG(price, ',') WITHIN GROUP (ORDER BY price) sub_price
FROM ...
虽然listagg
是SQL标准,但它是not yet supported by all databases。但是,大多数数据库通过不同的名称提供类似的功能 - 例如。 PostgreSQL和SQL Sever中的string_agg
(自2017年起)或MySQL中的group_concat
。
更多信息:http://modern-sql.com/feature/listagg(如果不支持listagg
,还会显示备选方案)
答案 1 :(得分:0)
这是一种可能的解决方案; 有关将多行连接成单行的更多信息,您可以找到here
DECALRE @tbl AS table (
company_Id int
,user_Id int
,price int
,sub_price varchar(25)
)
INSERT INTO @tbl values (123456, 11111, 200, NULL)
INSERT INTO @tbl values (123456, 11111, 500, NULL)
INSERT INTO @tbl values (456789, 22222, 300, NULL)
SELECT
company_Id
,user_Id
,SUM(price) AS price
,STUFF(
(SELECT ',' + cast(price as varchar)
FROM @tbl
WHERE company_Id = a.company_id
AND user_Id = a.user_Id
FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') AS sub_price
FROM @tbl a
GROUP BY company_Id, user_Id