UNPIVOTの代わりにCROSS APPLY
を使用して、条件付き集計を使用してこの結果をピボットします。
DECLARE @myTable TABLE (KodeDinasHeader NVARCHAR(255), anggaran_makan INT, anggaran_so INT, anggaran_transport INT, anggaran_tiket INT, anggaran_kost INT, realisasi_makan INT, realisasi_so INT, realisasi_transport INT, realisasi_tiket INT, realisasi_kost INT);
INSERT @myTable VALUES
('DN0000001', 3500, 2000, 5000, 10000, 7600, 5000, 1750, 4760, 10000, 9760)
, ('DN0000002', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
SELECT KodeDinasHeader
, Z
, MAX(CASE WHEN Y = 'angarran' THEN X END) angarran
, MAX(CASE WHEN Y = 'realisasi' THEN X END) realisasi
FROM @myTable
CROSS APPLY (
VALUES (anggaran_makan, 'angarran', 'makan')
, (anggaran_so, 'angarran', 'so')
, (anggaran_transport, 'angarran', 'transport')
, (anggaran_tiket, 'angarran', 'tiket')
, (anggaran_kost, 'angarran', 'kost')
, (realisasi_makan, 'realisasi', 'makan')
, (realisasi_so, 'realisasi', 'so')
, (realisasi_transport, 'realisasi', 'transport')
, (realisasi_tiket, 'realisasi', 'tiket')
, (realisasi_kost, 'realisasi', 'kost')) W(X, Y, Z)
GROUP BY Z, KodeDinasHeader;
個人的には、これを簡単にアンピボットするよりも簡単です。クロス適用は、基本的に行の各列の値を取得しており、カテゴリの内容に基づいて条件付き集計を使用して再表示します(列に基づいているため、ケースで手動で行う必要があります名前)。
EDIT:
はここであなたが本当にしたかった(あるいは単に概念を理解する)場合は、標準のPIVOT/UNPIVOTでそれを行うことができます方法です。
DECLARE @myTable TABLE (KodeDinasHeader NVARCHAR(255), anggaran_makan INT, anggaran_so INT, anggaran_transport INT, anggaran_tiket INT, anggaran_kost INT, realisasi_makan INT, realisasi_so INT, realisasi_transport INT, realisasi_tiket INT, realisasi_kost INT);
INSERT @myTable VALUES
('DN0000001', 3500, 2000, 5000, 10000, 7600, 5000, 1750, 4760, 10000, 9760)
, ('DN0000002', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
SELECT KodeDinasHeader, colSecondHalf, anggaran, realisasi
FROM (
SELECT KodeDinasHeader, val, LEFT(col, CHARINDEX('_', col) - 1) colFirstHalf, RIGHT(col, LEN(col) - CHARINDEX('_', col)) colSecondHalf
FROM @myTable
UNPIVOT (val for col in (anggaran_makan, anggaran_so, anggaran_transport, anggaran_tiket, anggaran_kost, realisasi_makan, realisasi_so, realisasi_transport, realisasi_tiket, realisasi_kost)) z) t
PIVOT (MAX(val) FOR colFirstHalf IN (anggaran, realisasi)) P;
基本的に、あなたがして、列名の最初の半分に基づいてピボットそして、アンダースコアで列の名前を分割することによって、あなたの行の値を取得し、各列をアンピボットしています。