Для того, чтобы получить результат, вам придется сделать это в два этапа. Во-первых, вам нужно будет объединить все PlayerNames
для каждого Position
. Когда у вас есть список, вы можете преобразовать данные из строк в столбцы.
Поскольку вы используете SQL Server, существует несколько различных способов объединения данных. Вы можете использовать STUFF
и FOR XML PATH
:
select t1.position,
STUFF(
(SELECT ', ' + t2.PlayerName
FROM yourtable t2
where t1.position = t2.position
FOR XML PATH (''))
, 1, 1, '') AS PlayerName
from yourtable t1
См. SQL Fiddle с демонстрацией. Это получает ваши данные в результате:
| POSITION | PLAYERNAME |
|----------|---------------|
| Forward | Tom, John |
| Center | Dave, Bob |
| Defense | Harry, James |
Теперь, когда ваши данные объединены, вы можете преобразовать данные с помощью агрегатной функции с выражением CASE или использовать PIVOT.
Объединить с CASE:
;with cte as
(
select t1.position,
STUFF(
(SELECT ', ' + t2.PlayerName
FROM yourtable t2
where t1.position = t2.position
FOR XML PATH (''))
, 1, 1, '') AS PlayerNames
from yourtable t1
)
select
max(case when position = 'Forward' then PlayerNames end) Forward,
max(case when position = 'Center' then PlayerNames end) Center,
max(case when position = 'Defense' then PlayerNames end) Defense,
max(case when position = 'Goalie' then PlayerNames end) Goalie
from cte
См. SQL Fiddle с демонстрацией.
ОСНОВНОЙ:
;with cte as
(
select t1.position,
STUFF(
(SELECT ', ' + t2.PlayerName
FROM yourtable t2
where t1.position = t2.position
FOR XML PATH (''))
, 1, 1, '') AS PlayerName
from yourtable t1
)
select Forward, Center, Defense, Goalie
from cte
pivot
(
max(playername)
for position in (Forward, Center, Defense, Goalie)
) piv;
См. SQL Fiddle с демонстрацией.
Оба дают результат:
| FORWARD | CENTER | DEFENSE | GOALIE |
|------------|------------|---------------|------------|
| Tom, John | Dave, Bob | Harry, James | Mike, Tim |
person
Taryn
schedule
16.01.2014