Ada beberapa cara Anda dapat mengubah data ini. Dalam posting asli Anda, Anda menyatakan bahwa PIVOT tampaknya terlalu rumit untuk skenario ini, tetapi dapat diterapkan dengan sangat mudah menggunakan UNPIVOT dan PIVOT fungsi di SQL Server.
Namun, jika Anda tidak memiliki akses ke fungsi tersebut, ini dapat direplikasi menggunakan UNION ALL ke UNPIVOT dan kemudian fungsi agregat dengan CASE pernyataan ke PIVOT :
Buat Tabel:
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);
Gabungkan Semua, Agregat, dan Versi KASUS:
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
Lihat SQL Fiddle dengan Demo
UNION ALL melakukan UNPIVOT data dengan mengubah kolom Paul, John, Tim, Eric menjadi baris terpisah. Kemudian Anda menerapkan fungsi agregat sum() dengan case pernyataan untuk mendapatkan kolom baru untuk setiap color .
Versi Statis Tanpa Pivot dan Pivot:
Keduanya UNPIVOT dan PIVOT fungsi di SQL server membuat transformasi ini lebih mudah. Jika Anda mengetahui semua nilai yang ingin Anda ubah, Anda dapat mengkodekannya menjadi versi statis untuk mendapatkan hasilnya:
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
Lihat SQL Fiddle dengan Demo
Kueri dalam dengan UNPIVOT melakukan fungsi yang sama dengan UNION ALL . Dibutuhkan daftar kolom dan mengubahnya menjadi baris, PIVOT kemudian melakukan transformasi terakhir menjadi kolom.
Versi Pivot Dinamis:
Jika Anda memiliki jumlah kolom yang tidak diketahui (Paul, John, Tim, Eric dalam contoh Anda) dan kemudian jumlah warna yang tidak diketahui untuk diubah, Anda dapat menggunakan sql dinamis untuk menghasilkan daftar ke UNPIVOT lalu 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, 'example@sqldat.com+'
from
(
select color, name, value
from yourtable
unpivot
(
value for name in ('example@sqldat.com+')
) unpiv
) src
pivot
(
sum(value)
for color in ('example@sqldat.com+')
) piv'
exec(@query)
Lihat SQL Fiddle dengan Demo
Versi dinamis menanyakan keduanya yourtable lalu sys.columns tabel untuk menghasilkan daftar item ke UNPIVOT dan PIVOT . Ini kemudian ditambahkan ke string kueri untuk dieksekusi. Kelebihan dari versi dinamis adalah jika Anda memiliki daftar color yang berubah-ubah dan/atau names ini akan menghasilkan daftar pada saat run-time.
Ketiga kueri akan menghasilkan hasil yang sama:
| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric | 3 | 5 | 1 |
| John | 5 | 4 | 2 |
| Paul | 1 | 8 | 2 |
| Tim | 1 | 3 | 9 |