我有一张简单的桌子,看起来像这张:
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是否有任何简单的方法来实现期望的输出?非常感谢您的提前帮助。
发布于 2017-10-20 11:46:30
这是一个可能的解决方案;关于将多个行连接到单行的更多信息,您可以找到这里。
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发布于 2017-10-20 11:41:09
可以使用listagg将组的元素转换为字符串:
SELECT ...
, LISTAGG(price, ',') WITHIN GROUP (ORDER BY price) sub_price
FROM ...虽然listagg是SQL标准,但它是尚未得到所有数据库的支持。然而,大多数数据库以不同的名称提供类似的功能,例如string_agg在PostgreSQL和Sever (自2017年以来)或group_concat在MySQL中。
更多信息:http://modern-sql.com/feature/listagg (如果不支持listagg,也会显示替代方案)
https://stackoverflow.com/questions/46848293
复制相似问题