Как свернуть несколько строк в одну строку и столбец? - PullRequest
0 голосов
/ 19 декабря 2018

Я получил таблицу, как показано ниже:

| 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 голосов
/ 23 декабря 2018

Ваш вопрос не очень понятен, однако вы можете использовать пару 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, вы не сможете использовать <code>STRING_AGG, и вам придется написать собственную логику агрегирования строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...