Ada beberapa cara untuk mengubah data ini. Di posting asli Anda, Anda menyatakan bahwa PIVOT
tampaknya terlalu rumit untuk skenario ini, tetapi dapat diterapkan dengan sangat mudah menggunakan fungsi UNPIVOT
danPIVOT
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);
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 ALL
melakukan UNPIVOT
data dengan mengubah kolom Paul, John, Tim, Eric
menjadi baris terpisah. Kemudian Anda menerapkan fungsi agregat sum()
dengan case
pernyataan tersebut untuk mendapatkan kolom baru untuk masing-masing color
.
Versi Statis Unpivot dan Pivot:
Baik fungsi UNPIVOT
dan PIVOT
di 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 UNPIVOT
menjalankan fungsi yang sama seperti UNION ALL
. Ini mengambil 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 membuat daftar UNPIVOT
dan 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 yourtable
dan kemudian 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 yang berubah colors
dan / atau names
ini 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 |