Bu verileri dönüştürebilmenin birkaç yolu vardır. Orijinal gönderide, aşağıdakileri beyan PIVOT
bu senaryo için çok karmaşık görünüyor, ama kullanan çok kolay uygulanabilir hem UNPIVOT
vePIVOT
SQL Server fonksiyonları.
Bununla birlikte, bu işlevlere erişiminiz yoksa, bu, UNION ALL
to UNPIVOT
ve ardından bir CASE
ifade 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 ALL
Yapar UNPIVOT
sütun dönüştürerek verilerin Paul, John, Tim, Eric
ayrı satırlara. Daha sonra , her biri için yeni sütunları elde etmek üzere deyimle sum()
birlikte toplama işlevini uygularsınız .case
color
Unpivot ve Pivot Statik Versiyon:
Hem UNPIVOT
ve PIVOT
SQL 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 UNPIVOT
aynı işlevi yerine getirir UNION ALL
. Sütun listesini alır ve satırlara dönüştürür, PIVOT
ardı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 UNPIVOT
ve 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 yourtable
ve sonra sys.columns
tablo öğelerin listesini oluşturmak için UNPIVOT
ve PIVOT
. Bu daha sonra yürütülecek bir sorgu dizesine eklenir. Dinamik sürümün artısı, değişen bir colors
ve / 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 |