具有多个值的数据透视列
Pivot columns with multiple values
Table #温度:
ID Name Hobbies
1 xxx Reading
1 xxx Sports
1 xxx Dance
2 xyz Dance
3 yyy Swimming
3 yyy Reading
现在,我希望结果集为:
ID Name Hobby1 Hobby2 Hobby3
1 xxx Reading Sports Dance
2 xyz Cooking
3 yyy Coloring Swimming
如何实现?我已经使用了多个兴趣爱好值,所以我不能硬编码。
因为你知道每个名字的最大爱好数你可以为每个名字生成行号并将其用于旋转
;with data as
(
SELECT row_number()over(partition by [ID] order by [Hobbies])rn,*
FROM ( VALUES (1,'xxx','Reading'),
(1,'xxx','Sports'),
(1,'xxx','Dance'),
(2,'xyz','Dance'),
(3,'yyy','Swimming'),
(3,'yyy','Reading')) tc ([ID], [Name], [Hobbies])
)
SELECT [ID],
[Name],
[Hobby1] = Max(CASE WHEN rn = 1 THEN [Hobbies] END),
[Hobby2] = Max(CASE WHEN rn = 2 THEN [Hobbies] END),
[Hobby3] = Max(CASE WHEN rn = 3 THEN [Hobbies] END)
FROM data
GROUP BY [ID],
[Name]
结果:
╔════╦══════╦═════════╦══════════╦════════╗
║ ID ║ Name ║ Hobby1 ║ Hobby2 ║ Hobby3 ║
╠════╬══════╬═════════╬══════════╬════════╣
║ 1 ║ xxx ║ Dance ║ Reading ║ Sports ║
║ 2 ║ xyz ║ Dance ║ NULL ║ NULL ║
║ 3 ║ yyy ║ Reading ║ Swimming ║ NULL ║
╚════╩══════╩═════════╩══════════╩════════╝
像这样尝试
DECLARE @tbl TABLE(ID INT,Name VARCHAR(100),Hobbies VARCHAR(100));
INSERT INTO @tbl VALUES
(1,'xxx','Reading')
,(1,'xxx','Sports')
,(1,'xxx','Dance')
,(2,'xyz','Dance')
,(3,'yyy','Swimming')
,(3,'yyy','Reading');
SELECT p.*
FROM
(
SELECT tbl.*
,'Hobby' + CAST(ROW_NUMBER() OVER(PARTITION BY tbl.Name ORDER BY tbl.ID) AS VARCHAR(10)) AS ColumnName
FROM @tbl AS tbl
) AS t
PIVOT
(
MAX(Hobbies) FOR ColumnName IN(Hobby1,Hobby2,Hobby3,Hobby4 /*add more if needed*/)
) AS p
结果
ID Name Hobby1 Hobby2 Hobby3 Hobby4
1 xxx Reading Sports Dance NULL
2 xyz Dance NULL NULL NULL
3 yyy Swimming Reading NULL NULL
试试这个......
select ID , Name , Hobby1 , Hobby2 , Hobby3
from
(
select
ID , Name,Hobbies,
case when Hobyno ='1' then 'Hobby1'
when Hobyno ='2' then 'Hobby2'
when Hobyno ='3' then 'Hobby3'
else null end as HobyNo
from
(
select *,ROW_NUMBER() OVER ( PARTITION BY id order by id ) HobyNo
from #temp
)a
where a.HobyNo <4 -- Add if you want more than 3 hobbie also edit case when
)a
pivot
(
max(Hobbies)
for Hobyno in ([Hobby1],[Hobby2],[Hobby3] )
) piv;
Table #温度:
ID Name Hobbies
1 xxx Reading
1 xxx Sports
1 xxx Dance
2 xyz Dance
3 yyy Swimming
3 yyy Reading
现在,我希望结果集为:
ID Name Hobby1 Hobby2 Hobby3
1 xxx Reading Sports Dance
2 xyz Cooking
3 yyy Coloring Swimming
如何实现?我已经使用了多个兴趣爱好值,所以我不能硬编码。
因为你知道每个名字的最大爱好数你可以为每个名字生成行号并将其用于旋转
;with data as
(
SELECT row_number()over(partition by [ID] order by [Hobbies])rn,*
FROM ( VALUES (1,'xxx','Reading'),
(1,'xxx','Sports'),
(1,'xxx','Dance'),
(2,'xyz','Dance'),
(3,'yyy','Swimming'),
(3,'yyy','Reading')) tc ([ID], [Name], [Hobbies])
)
SELECT [ID],
[Name],
[Hobby1] = Max(CASE WHEN rn = 1 THEN [Hobbies] END),
[Hobby2] = Max(CASE WHEN rn = 2 THEN [Hobbies] END),
[Hobby3] = Max(CASE WHEN rn = 3 THEN [Hobbies] END)
FROM data
GROUP BY [ID],
[Name]
结果:
╔════╦══════╦═════════╦══════════╦════════╗
║ ID ║ Name ║ Hobby1 ║ Hobby2 ║ Hobby3 ║
╠════╬══════╬═════════╬══════════╬════════╣
║ 1 ║ xxx ║ Dance ║ Reading ║ Sports ║
║ 2 ║ xyz ║ Dance ║ NULL ║ NULL ║
║ 3 ║ yyy ║ Reading ║ Swimming ║ NULL ║
╚════╩══════╩═════════╩══════════╩════════╝
像这样尝试
DECLARE @tbl TABLE(ID INT,Name VARCHAR(100),Hobbies VARCHAR(100));
INSERT INTO @tbl VALUES
(1,'xxx','Reading')
,(1,'xxx','Sports')
,(1,'xxx','Dance')
,(2,'xyz','Dance')
,(3,'yyy','Swimming')
,(3,'yyy','Reading');
SELECT p.*
FROM
(
SELECT tbl.*
,'Hobby' + CAST(ROW_NUMBER() OVER(PARTITION BY tbl.Name ORDER BY tbl.ID) AS VARCHAR(10)) AS ColumnName
FROM @tbl AS tbl
) AS t
PIVOT
(
MAX(Hobbies) FOR ColumnName IN(Hobby1,Hobby2,Hobby3,Hobby4 /*add more if needed*/)
) AS p
结果
ID Name Hobby1 Hobby2 Hobby3 Hobby4
1 xxx Reading Sports Dance NULL
2 xyz Dance NULL NULL NULL
3 yyy Swimming Reading NULL NULL
试试这个......
select ID , Name , Hobby1 , Hobby2 , Hobby3
from
(
select
ID , Name,Hobbies,
case when Hobyno ='1' then 'Hobby1'
when Hobyno ='2' then 'Hobby2'
when Hobyno ='3' then 'Hobby3'
else null end as HobyNo
from
(
select *,ROW_NUMBER() OVER ( PARTITION BY id order by id ) HobyNo
from #temp
)a
where a.HobyNo <4 -- Add if you want more than 3 hobbie also edit case when
)a
pivot
(
max(Hobbies)
for Hobyno in ([Hobby1],[Hobby2],[Hobby3] )
) piv;