2016-09-09 2 views
0

良い一日、私は私のアプリからの直接入力から単純なテーブルを持っており、ここでピボット/アンピボットSQLクエリ

KodeDinasHeader anggaran_makan anggaran_so anggaran_transport anggaran_tiket anggaran_kost realisasi_makan realisasi_so realisasi_transport realisasi_tiket realisasi_kost 
DN0000001    3500   2000   5000    10000   7600   5000   1750     4760    10000   9760 

テーブルとレコードの例である。このような結果を持ってすることが可能ですか?

  Anggaran Realisasi 
Makan  3500 5000 
So   2000 1750 
Tiket  10000 10000 
Transport 5000 4760 
Kost  7600 9760 

私はPivotとUnpivotについてオンラインでhttps://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspxを読んでいます。まだガイドが必要なようです。どんな助けもありがたいです

答えて

2

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; 

基本的に、あなたがして、列名の最初の半分に基づいてピボットそして、アンダースコアで列の名前を分割することによって、あなたの行の値を取得し、各列をアンピボットしています。