如何将多行汇总为单个行和列?

时间:2018-12-19 11:45:48

标签: sql sql-server tsql command row

我得到的表格如下:

| Ent | Loc | Pdate     | Sdate     | Ent1 | Loc1 | No  | 
----------------------------------------------------------
| 01  | A   | 2-sep-18  | 20-sep-18 | A1   | B    | S01 |
| 01  | A   | 1-sep-18  | 20-sep-18 | A1   | B    | S02 |
| 01  | A   | 3-sep-18  | 20-sep-18 | A1   | C    | S02 |
| 01  | A   | 1-sep-18  | 20-sep-18 | A1   | C    | S02 |
| 01  | A   | 1-sep-18  | 20-sep-18 | A1   | D    | S02 |
| 01  | A   | 3-sep-18  | 20-sep-18 | A1   | D    | S02 |

这是我想要的结果:

| Ent | Loc | Pdate     | Sdate     | Ent1 | Loc1 | No      | 
-------------------------------------------------------------
| 01  | A   | 2-sep-18  | 20-sep-18 | A1   | B    | S01,S02 |
| 01  | A   | 1-sep-18  | 20-sep-18 | A1   | B    | S01,S02 |
| 01  | A   | 3-sep-18  | 20-sep-18 | A1   | C    | S02     |
| 01  | A   | 1-sep-18  | 20-sep-18 | A1   | C    | S02     |
| 01  | A   | 1-sep-18  | 20-sep-18 | A1   | D    | S02     |
| 01  | A   | 3-sep-18  | 20-sep-18 | A1   | D    | S02     |

我认为它可能用于XML命令,但是我不确定如何使用。

1 个答案:

答案 0 :(得分:0)

您的问题不是很清楚,但是您可以使用几个CTE来准备数据,然后使用STRING_AGG(从SQL Server 2017开始)来连接值:

declare @tmp table( 
    Ent    varchar(2), 
    Loc    varchar(1),
    Pdate  date,      
    Sdate  date, 
    Ent1   varchar(2), 
    Loc1   varchar(1), 
    No     varchar(max)
) 

insert into @tmp values
 ('01', 'A', '2018-09-02', '2018-09-20', 'A1', 'B', 'S01')
,('01', 'A', '2018-09-01', '2018-09-20', 'A1', 'B', 'S02')
,('01', 'A', '2018-09-03', '2018-09-20', 'A1', 'C', 'S02')
,('01', 'A', '2018-09-01', '2018-09-20', 'A1', 'C', 'S02')
,('01', 'A', '2018-09-01', '2018-09-20', 'A1', 'D', 'S02')
,('01', 'A', '2018-09-03', '2018-09-20', 'A1', 'D', 'S02')

;with 
 A as(
    select ent, loc, ent1, loc1, no
    from @tmp
    group by ent, loc, ent1, loc1, no
    )
,B as(
    select ent, loc, ent1, loc1, STRING_AGG(No, ',') as No 
    from A
    group by ent, loc, ent1, loc1
    )
select T.Ent, T.Loc, T.Pdate, T.Sdate, T.Ent1, T.Loc1, B.No 
from @tmp T
inner join B 
    on T.Ent = B.Ent and T.Loc = B.Loc and T.Ent1 = B.Ent1 and T.Loc1 = B.Loc1

结果:

enter image description here

如果您使用的是SQL Server <2017,则将无法使用STRING_AGG,并且必须编写自己的字符串聚合逻辑。