求和并记录在sql中总结的内容

时间:2017-10-20 11:37:09

标签: sql sql-server-2008

我有一个简单的表格如下:

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

有没有简单的方法来实现所需的输出?非常感谢您的帮助。

2 个答案:

答案 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