Bu verileri dönüştürebilmenin birkaç yolu vardır. Orijinal gönderide, aşağıdakileri beyan PIVOTbu senaryo için çok karmaşık görünüyor, ama kullanan çok kolay uygulanabilir hem UNPIVOTvePIVOT SQL Server fonksiyonları.
Bununla birlikte, bu işlevlere erişiminiz yoksa, bu, UNION ALLto UNPIVOTve ardından bir CASEifade ile bir toplama işlevi kullanılarak çoğaltılabilir PIVOT:
Tablo Oluştur:
CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int);
INSERT INTO yourTable
([color], [Paul], [John], [Tim], [Eric])
VALUES
('Red', 1, 5, 1, 3),
('Green', 8, 4, 3, 5),
('Blue', 2, 2, 9, 1);
Union All, Aggregate ve CASE Sürümü:
select name,
sum(case when color = 'Red' then value else 0 end) Red,
sum(case when color = 'Green' then value else 0 end) Green,
sum(case when color = 'Blue' then value else 0 end) Blue
from
(
select color, Paul value, 'Paul' name
from yourTable
union all
select color, John value, 'John' name
from yourTable
union all
select color, Tim value, 'Tim' name
from yourTable
union all
select color, Eric value, 'Eric' name
from yourTable
) src
group by name
Demo ile SQL Fiddle'ı görün
UNION ALLYapar UNPIVOTsütun dönüştürerek verilerin Paul, John, Tim, Ericayrı satırlara. Daha sonra , her biri için yeni sütunları elde etmek üzere deyimle sum()birlikte toplama işlevini uygularsınız .casecolor
Unpivot ve Pivot Statik Versiyon:
Hem UNPIVOTve PIVOTSQL server fonksiyonları çok daha kolay bu dönüşümü yapmak. Dönüştürmek istediğiniz tüm değerleri biliyorsanız, sonucu almak için bunları statik bir sürüme sabit kodlayabilirsiniz:
select name, [Red], [Green], [Blue]
from
(
select color, name, value
from yourtable
unpivot
(
value for name in (Paul, John, Tim, Eric)
) unpiv
) src
pivot
(
sum(value)
for color in ([Red], [Green], [Blue])
) piv
Demo ile SQL Fiddle'ı görün
İç sorgu ile UNPIVOTaynı işlevi yerine getirir UNION ALL. Sütun listesini alır ve satırlara dönüştürür, PIVOTardından son dönüşümü sütunlara dönüştürür.
Dinamik Pivot Sürümü:
Bilinmeyen sayıda sütununuz varsa ( Paul, John, Tim, Ericörneğinizde) ve sonra dönüştürülecek bilinmeyen sayıda renk varsa, listeyi oluşturmak için dinamik sql'yi kullanabilir UNPIVOTve ardından PIVOT:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@colsPivot as NVARCHAR(MAX)
select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id('yourtable') and
C.name <> 'color'
for xml path('')), 1, 1, '')
select @colsPivot = STUFF((SELECT ','
+ quotename(color)
from yourtable t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'select name, '+@colsPivot+'
from
(
select color, name, value
from yourtable
unpivot
(
value for name in ('+@colsUnpivot+')
) unpiv
) src
pivot
(
sum(value)
for color in ('+@colsPivot+')
) piv'
exec(@query)
Görmek Demo ile SQL Fiddle'ı
Dinamik versiyonu hem sorgular yourtableve sonra sys.columnstablo öğelerin listesini oluşturmak için UNPIVOTve PIVOT. Bu daha sonra yürütülecek bir sorgu dizesine eklenir. Dinamik sürümün artısı, değişen bir colorsve / veyanames bu, çalışma zamanında listeyi oluşturacaktır.
Üç sorgu da aynı sonucu verecektir:
| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric | 3 | 5 | 1 |
| John | 5 | 4 | 2 |
| Paul | 1 | 8 | 2 |
| Tim | 1 | 3 | 9 |