我得到的表格如下:
| 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命令,但是我不确定如何使用。
答案 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
结果:
如果您使用的是SQL Server <2017,则将无法使用STRING_AGG
,并且必须编写自己的字符串聚合逻辑。