这是我的数据。我正在尝试将垂直数据转换为水平数据。我尝试使用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;
答案 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)