Преобразовать вертикальные данные в горизонтальные данные с помощью сводки, но без агрегирования? - PullRequest
0 голосов
/ 04 мая 2018

Это мои данные. Я пытаюсь преобразовать вертикальные данные в горизонтальные данные. Я пытался использовать PIVOT, но у меня нет столбца для использования в качестве совокупного.

Мне не нужно использовать PIVOT, но это оператор, который я использовал для такого рода вещей. Я тоже обдумал это, так как знаю все возможные GroupId с.

Name      GroupId
Joe       B1
John      B2
Mary      C1
Lisa      D2
Joe       D2

Результат будет примерно таким. Я должен объединить все строки для каждого имени:

Name   B1   B2   C1   D2
Joe    B1             D2
John        B2        
Mary             C1
Lisa                  D2

Я думал о чем-то подобном, но я знал, что это не даст желаемых результатов.

declare @table table
(
    Name varchar(10),
    GroupId varchar(2)
)

insert into @table
select 'Joe', 'B1' union
select 'John','B2' union
select 'Mary','C1' union
select 'Lisa','D2' union
select 'Joe','D2'

    select *
    from 
    (
      select Name, GroupId
      from @table
    ) src
    pivot
    (
      min(Name)
      for GroupId in ([B1], [B2], [C1], [D2])
    ) piv;

Ответы [ 2 ]

0 голосов
/ 04 мая 2018
;WITH CTE AS (SELECT Name, GroupId, 1 id FROM @table)
select Name
    , [B1] = CASE WHEN [B1] IS NULL THEN '' ELSE 'B1' END
    , [B2] = CASE WHEN [B2] IS NULL THEN '' ELSE 'B2' END
    , [C1] = CASE WHEN [C1] IS NULL THEN '' ELSE 'C1' END
    , [D2] = CASE WHEN [D2] IS NULL THEN '' ELSE 'D2' END
from CTE
PIVOT (min(ID) for GroupId in ([B1], [B2], [C1], [D2])) piv;

OUTPUT

Name       B1   B2   C1   D2
---------- ---- ---- ---- ----
Joe        B1             D2
John            B2        
Lisa                      D2
Mary                 C1   

(4 rows affected)
0 голосов
/ 04 мая 2018

Вы можете использовать условное агрегирование вместо

select Name,
       max(case when GroupId = 'B1' then GroupId end) [B1],
       max(case when GroupId = 'B2' then GroupId end) [B2],
       max(case when GroupId = 'C1' then GroupId end) [C1],
       max(case when GroupId = 'D2' then GroupId end) [D2]
from @table t
group by Name;

Для вашей текущей попытки с оператором pivot выполните агрегирование только с одним столбцом, который является GroupId

select * 
from 
(  
    select Name, GroupId
    from @table
) src pivot (
      max(GroupId)
      for GroupId in ([B1], [B2], [C1], [D2])
 ) piv;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...