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, '[email protected]+'
from
(
select color, name, value
from yourtable
unpivot
(
value for name in ('[email protected]+')
) unpiv
) src
pivot
(
sum(value)
for color in ('[email protected]+')
) 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 |