Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kolom Dinamis - SQL Server - Bulan sebagai Kolom

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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Query untuk memilih data antara dua tanggal dengan format m/d/yyyy

  2. Bagaimana cara membuat daftar yang dipisahkan koma menggunakan kueri SQL?

  3. Buat Query di SQL Server 2017

  4. Tambahkan Leading &Trailing Zeros di SQL Server

  5. SQL Server 2005/2008:Sisipkan File di kolom varbinary(max) di Transact-SQL