Ada beberapa cara untuk mengubah data ini. Di posting asli Anda, Anda menyatakan bahwa PIVOTtampaknya terlalu rumit untuk skenario ini, tetapi dapat diterapkan dengan sangat mudah menggunakan fungsi UNPIVOTdanPIVOT di SQL Server.
Namun, jika Anda tidak memiliki akses ke fungsi tersebut, ini dapat direplikasi menggunakan UNION ALLke UNPIVOTdan kemudian fungsi agregat dengan CASEpernyataan 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);
Union All, Agregat dan Versi CASE:
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
Itu UNION ALLmelakukan UNPIVOTdata dengan mengubah kolom Paul, John, Tim, Ericmenjadi baris terpisah. Kemudian Anda menerapkan fungsi agregat sum()dengan casepernyataan tersebut untuk mendapatkan kolom baru untuk masing-masing color.
Versi Statis Unpivot dan Pivot:
Baik fungsi UNPIVOTdan PIVOTdi server SQL membuat transformasi ini jauh lebih mudah. Jika Anda mengetahui semua nilai yang ingin diubah, Anda dapat melakukan hard-code pada nilai tersebut 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 UNPIVOTmenjalankan fungsi yang sama seperti UNION ALL. Ini mengambil daftar kolom dan mengubahnya menjadi baris, PIVOTkemudian melakukan transformasi terakhir menjadi kolom.
Versi Pivot Dinamis:
Jika Anda memiliki jumlah kolom yang tidak diketahui ( Paul, John, Tim, Ericdalam contoh Anda) dan kemudian jumlah warna yang tidak diketahui untuk diubah, Anda dapat menggunakan sql dinamis untuk membuat daftar UNPIVOTdan kemudian 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)
Lihat SQL Fiddle dengan Demo
Kueri versi dinamis keduanya yourtabledan kemudian sys.columnstabel untuk menghasilkan daftar item ke UNPIVOTdan PIVOT. Ini kemudian ditambahkan ke string kueri untuk dieksekusi. Kelebihan dari versi dinamis adalah jika Anda memiliki daftar yang berubah colorsdan / atau namesini akan menghasilkan daftar pada saat run-time.
Ketiga kueri tersebut 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 |