2014-01-16 2 views
1

Извините, я новичок в SQL поэтому мне было интересно, если кто-то может мне помочь со следующим:SQL Server 2008 Pivot и Concat

У меня есть таблица

+--------+----------+ 
|Position|PlayerName| 
+--------+----------+ 
|Forward |Tom  | 
+--------+----------+ 
|Forward |John  | 
+--------+----------+ 
|Center |Dave  | 
+--------+----------+ 
|Defense |Harry  | 
+--------+----------+ 
|Center |Bob  | 
+--------+----------+ 
|Defense |James  | 
+--------+----------+ 
|Goalie |Mike  | 
+--------+----------+ 
|Goalie |Tim  | 
+--------+----------+ 

Результат

+---------+---------+------------+---------+ 
|Forward |Center |Defense  |Goalie | 
+---------+---------+------------+---------+ 
|Tom, John|Dave, Bob|Harry, James|Mike, Tim| 
+---------+---------+------------+---------+ 
+4

вы пытались написать запрос, чтобы сделать это? Вы действительно должны продемонстрировать свои попытки решить эту проблему. – Taryn

+0

Это не просто свод, вы также объединяете потенциальные строки. –

+0

Попробуйте использовать sqlfiddle.com для этого примера - это поможет вам и тем, кто пытается вам помочь. – eebbesen

ответ

2

Чтобы получить результат, вам нужно сделать это в два этапа. Во-первых, вам нужно будет объединить все 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 with Demo. Это получает данные в результат:

| POSITION | PLAYERNAME | 
|----------|---------------| 
| Forward |  Tom, John | 
| Center |  Dave, Bob | 
| Defense | Harry, James | 

Теперь, когда данные были сцеплены, то вы можете преобразовать данные с помощью агрегатной функции с помощью выражения CASE, или вы можете использовать PIVOT.

Совокупные с ДЕЛУ:

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

Pivot:

;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 with Demo.

Оба дают результат:

| FORWARD |  CENTER |  DEFENSE |  GOALIE | 
|------------|------------|---------------|------------| 
| Tom, John | Dave, Bob | Harry, James | Mike, Tim | 
+0

Спасибо bluefeet, я сейчас читаю о функции вещей, спасибо за то, что обратил меня на это. Я никогда этого не видел. Еще раз спасибо за помощь. Теперь я настраиваю учетную запись SQL Fiddle. Благодарю. –