Data Anda sudah diputar, tetapi perlu diputar di tingkat yang berbeda. Saya pikir cara terbaik untuk menangani ini adalah dengan melepasnya terlebih dahulu, lalu menangani level pivot yang benar kedua.
Langkah 1:Batalkan Pivot
Anda dapat menggunakan SQL 2005 UNPIVOT perintah, atau gunakan teknik CROSS JOIN. Berikut adalah contoh keduanya. Catatan saya meninggalkan bulan di tengah untuk menjaga hal-hal sederhana. Tambahkan saja.
-- CROSS JOIN method (also works in SQL 2000)
SELECT
P.Project,
Mo =
DateAdd(mm,
X.MonthNum,
DateAdd(yy, P.[Year] - 1900, '19000101')
),
Amount =
CASE X.MonthNum
WHEN 0 THEN Jan
WHEN 1 THEN Feb
WHEN 11 THEN Dec
END
FROM
ProjectData P
CROSS JOIN (
SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 11
) X (MonthNum)
Setiap baris diulang 12 kali, kemudian pernyataan CASE hanya dikeluarkan satu bulan untuk setiap baris, sehingga data tidak dipivot dengan baik.
-- UNPIVOT method
SELECT
P.Project,
Mo =
DateAdd(mm,
Convert(int, P.MonthNum),
DateAdd(yy, P.[Year] - 1900, '19000101')
),
P.Amount
FROM
(
SELECT Project, [Year], [0] = Jan, [1] = Feb, [11] = Dec
FROM ProjectData
) X UNPIVOT (Amount FOR MonthNum IN ([0], [1], [11])) P
DROP TABLE ProjectData
Tidak ada metode yang merupakan pemenang kinerja yang jelas sepanjang waktu. Terkadang yang satu bekerja lebih baik daripada yang lain (tergantung pada data yang diputar). Metode UNPIVOT menggunakan Filter dalam rencana eksekusi yang tidak dilakukan CROSS JOIN.
Langkah 2:Putar Lagi
Sekarang, bagaimana menggunakan data unpivoted. Anda tidak mengatakan bagaimana Anda seseorang akan memakan ini, tetapi karena Anda harus meletakkan data dalam beberapa jenis file output, saya mengusulkan menggunakan SSRS (Sql Server Reporting Services), yang datang dengan SQL Server 2005 tanpa biaya tambahan.
Cukup gunakan Matriks laporkan objek untuk memutar salah satu kueri di atas. Objek ini dengan senang hati menentukan nilai data untuk dijadikan label kolom pada waktu laporan dan terdengar seperti yang Anda butuhkan. Jika Anda menambahkan kolom yang memformat tanggal persis seperti yang Anda suka, maka Anda dapat memesan menurut kolom Mo, tetapi gunakan ekspresi baru sebagai label kolom.
SSRS juga memiliki berbagai macam format dan pilihan penjadwalan yang tersedia. Misalnya, Anda dapat memintanya mengirim file Excel melalui email atau menyimpan halaman web ke berbagi file.
Beri tahu saya jika ada yang tertinggal.
Bagi siapa saja yang ingin melihat kode di atas beraksi, berikut ini beberapa skrip pembuatan untuk Anda:
USE tempdb
CREATE TABLE ProjectData (
Project varchar(10),
[Year] int,
Jan decimal(15, 2),
Feb decimal(15, 2),
Dec decimal(15, 2)
)
SET NOCOUNT ON
INSERT ProjectData VALUES ('11-11079', 2008, 0.0, 0.0, 75244.90)
INSERT ProjectData VALUES ('11-11079', 2009, 466.0, 0.0, 0.0)
INSERT ProjectData VALUES ('11-11079', 2010, 855.0, 0.0, 0.0)
INSERT ProjectData VALUES ('01-11052', 2009, 56131.0, 0.0, 0.0)