2017-10-20 96 views
0

总结起来,我有一个简单的表看起来像这样的:总和的记录,并添加笔记内容是在SQL

company_Id user_Id price sub_price 
    123456  11111  200  NULL 
    123456  11111  500  NULL 
    456789  22222  300  NULL 

我想巩固其具有COUNT(*)> = 2的记录成一排总结价格,但要注意列sub_price中总结的内容。期望的输出应该看起来像这样:

company_Id user_Id price sub_price 
    123456  11111  700  200,500 
    456789  22222  300  300 

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

+0

标签您与您正在使用的数据库的问题。 –

+0

你使用了什么[标签:rdbms]? – Mureinik

+0

对不起,我使用MS SQL Server 2008 – mateskabe

回答

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 
+0

非常感谢!我喜欢你的方法! – mateskabe

1

您可以使用listagg把一组元素转换成字符串:

SELECT ... 
    , LISTAGG(price, ',') WITHIN GROUP (ORDER BY price) sub_price 
    FROM ... 

虽然listagg是SQL标准,这是not yet supported by all databases。但是,大多数数据库都以不同的名称提供类似的功能 - 例如。 string_agg在MySQL中的PostgreSQL和SQL Sever(自2017年以来)或group_concat。 (不支持如果listagg还示出的替代品)http://modern-sql.com/feature/listagg