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

SQL - Pivot beberapa kolom tanpa Agregat

Sebagian dari masalahnya adalah Anda memiliki data yang tidak dinormalisasi di beberapa kolom yang ingin Anda putar. Idealnya, Anda harus mempertimbangkan untuk memperbaiki struktur tabel Anda sehingga Anda akan lebih mudah memelihara dan membuat kueri. Jika Anda tidak dapat memperbaiki struktur tabel, maka Anda harus melepas kolom terlebih dahulu untuk kemudian menerapkan PIVOT untuk mendapatkan hasil akhir.

Proses UNPIVOT akan mengambil beberapa kolom dan mengubahnya menjadi beberapa baris. Bergantung pada versi SQL Server Anda, ada beberapa cara yang bisa Anda lakukan. Anda dapat menggunakan fungsi UNPIVOT atau karena Anda menggunakan SQL Server 2008, Anda dapat menggunakan CROSS APPLY dengan klausa VALUES untuk membatalkan pivot.

Kode CROSS APPLY/VALUES akan menjadi:

select t.producttitle, c.col, c.value
from tmpData t
cross apply
(
  values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
) c (col, value)

Lihat SQL Fiddle dengan Demo . Ini mengambil beberapa kolom Anda dan menempatkan data ke dalam format yang mirip dengan ini:

| PRODUCTTITLE |  COL | VALUE |
-------------------------------
|    Product 1 |  Dec |     0 |
|    Product 1 | Dec# |     0 |
|    Product 1 |  Nov |     0 |
|    Product 1 | Nov# |     0 |
|    Product 1 |  Oct |     0 |
|    Product 1 | Oct# |     0 |
|    Product 1 |  Sep |     0 |
|    Product 1 | Sep# |     0 |

Setelah data dalam format ini, Anda dapat menerapkan PIVOT ke nilai di col yang berisi nama bulan:

select producttitle, jan, [jan#], feb, [feb#], mar, [mar#], apr, [apr#],
  may, [may#], jun, [jun#], jul, [jul#], aug, [aug#],
  sep, [sep#], oct, [oct#], nov, [nov#], dec, [dec#]
from
(
  select t.producttitle, c.col, c.value
  from tmpData t
  cross apply
  (
    values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
  ) c (col, value)
) d
pivot
(
  sum(value)
  for col in (jan, [jan#], feb, [feb#], mar, [mar#], apr, [apr#],
              may, [may#], jun, [jun#], jul, [jul#], aug, [aug#],
              sep, [sep#], oct, [oct#], nov, [nov#], dec, [dec#])
) piv;

Lihat SQL Fiddle dengan Demo . Ini memberikan hasil:

| PRODUCTTITLE | JAN | JAN# |  FEB | FEB# |  MAR | MAR# |  APR | APR# |  MAY | MAY# | JUN | JUN# | JUL | JUL# | AUG | AUG# | SEP | SEP# | OCT | OCT# | NOV | NOV# | DEC | DEC# |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|    Product 1 |   5 |    2 |    5 |    1 |    5 |    4 |    5 |    6 | 4.44 |    9 |   5 |    1 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |
|    Product 2 |   0 |    0 |    0 |    0 |    0 |    0 | 4.33 |    3 | 4.67 |    3 |   5 |    1 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    0 |
|    Product 3 | 4.6 |    5 | 4.75 |    8 | 4.75 |    8 |    4 |    6 |    5 |    6 |   5 |    3 |   0 |    0 |   0 |    0 |   0 |    0 |   0 |    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. Cara terbaik untuk menyimpan waktu (jj:mm) dalam database

  2. SQL Server BCP mengekspor file yang rusak?

  3. Pemodelan data untuk tabel yang sama dengan kolom yang sama

  4. Bagaimana cara menghapus namespace yang berlebihan dalam kueri bersarang saat menggunakan FOR XML PATH

  5. Peregangan Database di SQL Server 2016 RTM