Ada beberapa cara untuk mengubah data dari banyak baris menjadi kolom.
Menggunakan PIVOT
Di SQL Server, Anda dapat menggunakan PIVOT
fungsi untuk mengubah data dari baris ke kolom:
select Firstname, Amount, PostalCode, LastName, AccountNumber
from
(
select value, columnname
from yourtable
) d
pivot
(
max(value)
for columnname in (Firstname, Amount, PostalCode, LastName, AccountNumber)
) piv;
Lihat Demo .
Pivot dengan jumlah tidak diketahui columnnames
Jika Anda memiliki jumlah yang tidak diketahui columnnames
yang ingin Anda transpos, maka Anda dapat menggunakan SQL dinamis:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(ColumnName)
from yourtable
group by ColumnName, id
order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols + N' from
(
select value, ColumnName
from yourtable
) x
pivot
(
max(value)
for ColumnName in (' + @cols + N')
) p '
exec sp_executesql @query;
Lihat Demo .
Menggunakan fungsi agregat
Jika Anda tidak ingin menggunakan PIVOT
fungsi, maka Anda bisa menggunakan fungsi agregat dengan CASE
ekspresi:
select
max(case when columnname = 'FirstName' then value end) Firstname,
max(case when columnname = 'Amount' then value end) Amount,
max(case when columnname = 'PostalCode' then value end) PostalCode,
max(case when columnname = 'LastName' then value end) LastName,
max(case when columnname = 'AccountNumber' then value end) AccountNumber
from yourtable
Lihat Demo .
Menggunakan banyak gabungan
Ini juga dapat diselesaikan menggunakan beberapa gabungan, tetapi Anda akan memerlukan beberapa kolom untuk mengaitkan setiap baris yang tidak Anda miliki dalam data sampel Anda. Tetapi sintaks dasarnya adalah:
select fn.value as FirstName,
a.value as Amount,
pc.value as PostalCode,
ln.value as LastName,
an.value as AccountNumber
from yourtable fn
left join yourtable a
on fn.somecol = a.somecol
and a.columnname = 'Amount'
left join yourtable pc
on fn.somecol = pc.somecol
and pc.columnname = 'PostalCode'
left join yourtable ln
on fn.somecol = ln.somecol
and ln.columnname = 'LastName'
left join yourtable an
on fn.somecol = an.somecol
and an.columnname = 'AccountNumber'
where fn.columnname = 'Firstname'
cross join
daripadaleft join
karena setiap subquery mengembalikan satu baris.Ini bukan metode daripada hanya satu skrip tetapi memberi Anda lebih banyak fleksibilitas.
Pertama-tama Ada 3 objek:
ColumnActionList
] -> menyimpan data sebagai parameterproc_PivotPrepare
] -> menyiapkan data kamiproc_PivotExecute
] -> jalankan skripBUAT JENIS [dbo]. [ColumnActionList] SEBAGAIMANA TABEL ([ID] [smallint] TIDAK NULL, [ColumnName] nvarchar BUKAN NULL, [Aksi] nchar BUKAN NULL); PERGILAH
Dari mengeksekusi kueri pertama (dengan mengirimkan sumber DB dan nama tabel) Anda akan mendapatkan kueri eksekusi yang dibuat sebelumnya untuk SP kedua, yang harus Anda lakukan adalah mendefinisikan kolom dari sumber Anda: + Stabil + Nilai (akan digunakan untuk mengonsentrasikan nilai berdasarkan itu) + Dim (kolom yang ingin Anda gunakan untuk berputar dengan)
Nama dan tipe data akan ditentukan secara otomatis!
Saya tidak bisa merekomendasikannya untuk lingkungan produksi apa pun tetapi melakukan pekerjaan untuk permintaan BI adhoc.
sumber
Could not find stored procedure 'dbo.sp_PivotIt'.
Ada saran?sp_Pivot_Execute
ubah keproc_PivotExecute
.