2013-05-24 5 views
0

У меня возникают некоторые трудности с помощью Pivot-запроса для моей конкретной ситуации. я должен Опускайте строковый столбец над столбцом INT (так только 2 колонки) Третий столбец проведет конкатенацию строкTsql Pivot on string + concat

Example: 
CustomerID Breed 
-------------------------- 
1   Pug 
1   Bulldog 
1   Doberman 
2   Doberman 
3   Bulldog 
3   Doberman 
3   Pug 
3   Poedel 


Result:  
CustomerID Pug Bulldog Doberman Poodle Concat 
----------------------------------------------------------------------------- 
1   Pug Bulldog Doberman NULL  Pug,Bulldog,Doberman 
2   NULL NULL  Doberman NULL  Doberman 
3   Pug Bulldog Doberman Poodle Pug,Bulldog,Doberman,Poodle 

Я попытался методы, описанные в следующем сообщении: SQL Server: Examples of PIVOTing String data

Но это просто возвращает NULL повсюду, я предполагаю, что это из-за моей колонки ID.

Любая помощь очень ценится.

+0

Не могли бы вы отредактировать вопрос и добавить запрос, который вы разработали до сих пор? –

ответ

0

Вы можете объединить список пород, используя FOR XML PATH и STUFF. Запрос, чтобы получить customerID со списком пород будет похож на это:

select customerid, breed, 
STUFF((SELECT DISTINCT ', ' + t2.breed 
     FROM yt t2 
     WHERE t1.customerid = t2.customerid 
     FOR XML PATH('')), 1, 1, '') breedList 
from yt t1 

См SQL Fiddle with Demo.

Тогда вы можете легко включить этот запрос в PIVOT:

;with cte as 
(
    select customerid, breed, 
    STUFF((SELECT DISTINCT ', ' + t2.breed 
      FROM yt t2 
      WHERE t1.customerid = t2.customerid 
      FOR XML PATH('')), 1, 1, '') breedList 
    from yt t1 
) 
select customerid, Pug, Bulldog, Doberman, Poodle, breedList 
from cte 
pivot 
(
    max(breed) 
    for breed in (Pug, Bulldog, Doberman, Poodle) 
) piv 
order by customerid; 

См SQL Fiddle with Demo. Это дает результат:

| CUSTOMERID | PUG | BULLDOG | DOBERMAN | POODLE |      BREEDLIST | 
--------------------------------------------------------------------------------------- 
|   1 | Pug | Bulldog | Doberman | (null) |   Bulldog, Doberman, Pug | 
|   2 | (null) | (null) | Doberman | (null) |      Doberman | 
|   3 | Pug | Bulldog | Doberman | Poodle | Bulldog, Doberman, Poodle, Pug | 
+0

Nice, Я не был знаком с функцией STUFF. Также все примеры, которые я видел с таблицей Pivot, включали 3 столбца. Спасибо за понимание. – Heinz