SQL Server: объединить несколько строк в 1 строку - PullRequest
0 голосов
/ 05 октября 2018

Я использую SQL Server 2012 Standard и имею отношение к производительности для объединения нескольких строк в одну.

Пример:

enter image description here

Я могу использовать запрос ниже, чтобы получить данные, как ожидалось, но производительность не очень хорошая.Есть ли другой запрос с лучшей производительностью?

WITH Data AS
(
    SELECT 88 ID, 1 AS [OrderFW],'a' AS Code,'n1' as Name UNION
    SELECT 88 ID,2 AS [OrderFW],'a' AS Code,'n2' as Name UNION
    SELECT 88 ID,3 AS [OrderFW],'a' AS Code,'n3' as Name UNION
    SELECT 99 ID,1 AS [OrderFW],'b' AS Code,'n4' as Name UNION
    SELECT 99 ID,2 AS [OrderFW],'b' AS Code,'n5' as Name
)
SELECT 
    d1.Code code1, d1.Name name1, 
    d2.Code code2, d2.Name name2,
    d3.Code code3, d3.Name name3
FROM
    Data d1
LEFT OUTER JOIN
    Data d2 ON d1.ID = d2.ID AND d2.OrderFW = 2
LEFT OUTER JOIN
    Data d3 ON d1.ID = d3.ID AND d3.OrderFW = 3
WHERE
    d1.OrderFW = 1

1 Ответ

0 голосов
/ 05 октября 2018

Я бы попробовал с агрегацией:

select Id, 
       max(case when seq = 1 then code end) as code1,
       max(case when seq = 1 then name end) as name1,
       max(case when seq = 2 then code end) as code2,
       max(case when seq = 2 then name end) as name2,
       max(case when seq = 3 then code end) as code3,
       max(case when seq = 3 then name end) as name3
from (select d.*,
             row_number() over (partition by code order by order) as seq
      from data d
     ) d
group by Id;

РЕДАКТИРОВАТЬ: Если у вас уже есть sequence (т.е. Order), то достаточно только агрегации:

select Id, 
       max(case when [order] = 1 then code end) as code1,
       max(case when [order] = 1 then name end) as name1,
       max(case when [order] = 2 then code end) as code2,
       max(case when [order] = 2 then name end) as name2,
       max(case when [order] = 3 then code end) as code3,
       max(case when [order] = 3 then name end) as name3
from data d
group by Id;

РЕДАКТИРОВАТЬ: Спасибо JohnLBevan за демо.

Вот Пример SQL Fiddle .

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