列明智的总和和逗号分隔的行ID

时间:2019-10-21 11:56:16

标签: sql sql-server sql-server-2012

我在SQL Server的一张表中有以下数据:

Id     Dealer                       Region  Comission
-----------------------------------------------------
177    Synergy Meditech             North   217500.00
1      Indian Orthocare Surgicals   South     1500.00
9      Indian Orthocare Surgicals   South     1500.00
90     Indian Orthocare Surgicals   West      9760.73
113    Indian Orthocare Surgicals   West     39756.90
171    Innovative Concepts          South   127500.00
172    Innovative Concepts          South   142500.00
191    MIDMED HEALTHCARE            North   427500.00
198    MIDMED HEALTHCARE            North   199500.00
185    Cass Associates              West    337500.00

我上面想要的输出是:

Id               Dealer                       Region  Comission
----------------------------------------------------------------    
177              Synergy Meditech             North   217500.00
1,9              Indian Orthocare Surgicals   South     3000.00
90,113           Indian Orthocare Surgicals   West     49517.63
171,172          Innovative Concepts          South   270000.00
191,198          MIDMED HEALTHCARE            North   627000.00
185              Cass Associates              West    337500.00

即关于commissionDealer分组的Region列的总和,以及以逗号分隔的ID。

请帮助我。

2 个答案:

答案 0 :(得分:3)

使用string_agg()

select string_agg(id, ',') within group (order by id) as ids,
       dealer, region, sum(commission) as commission
from t
group by dealer, region;

在早期版本中:

select stuff( (select concat(',', t2.id)
               from t t2
               where t2.dealer = dr.dealer and t2.region = dr.region
               order by t2.id
               for xml path ('')
              ), 1, 1, ''
            ) as ids
       dr.*
from (select dealer, region, sum(commission) as commission
      from t
      group by dealer, region
     ) dr;

id似乎是数字,因此您不必担心特殊字符。

答案 1 :(得分:0)

我只是将其汇总为一条语句:

CREATE TABLE #tmp(Id int, Dealer varchar(50),  Region varchar(20),  Comission decimal(10,2))

INSERT INTO #tmp VALUES(177,'Synergy Meditech',' North',217500.00)
INSERT INTO #tmp VALUES(1,'Indian Orthocare Surgicals','South',1500.00)
INSERT INTO #tmp VALUES(9,'Indian Orthocare Surgicals','South',1500.00)
INSERT INTO #tmp VALUES(90,'Indian Orthocare Surgicals','West',9760.73)
INSERT INTO #tmp VALUES(113,'Indian Orthocare Surgicals','West',39756.90)
INSERT INTO #tmp VALUES(171,'Innovative Concepts','South',127500.00)
INSERT INTO #tmp VALUES(172,'Innovative Concepts','South',142500.00)
INSERT INTO #tmp VALUES(191,'MIDMED HEALTHCARE','North',427500.00)
INSERT INTO #tmp VALUES(198,'MIDMED HEALTHCARE','North',199500.00)
INSERT INTO #tmp VALUES(185,'Cass Associates','West',337500.00)


SELECT STUFF((
            SELECT ',' + CAST(ID as varchar(5))
            FROM #tmp t1 where t2.Dealer = t1.Dealer and t1.Region = t2.Region
            FOR XML PATH('')
            ), 1, 1, ''), Dealer,Region,SUM(t2.Comission) Comission  
FROM #tmp t2
GROUP by  Dealer,Region