使用pivot将垂直数据转换为水平数据但没有聚合?

时间:2018-05-04 17:01:09

标签: sql sql-server sql-server-2008 tsql

这是我的数据。我正在尝试将垂直数据转换为水平数据。我尝试使用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 :(得分:3)

您可以使用条件聚合

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;

答案 1 :(得分:0)

;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;

<强>输出

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

(4 rows affected)