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

Cara sederhana untuk mengubah urutan kolom dan baris dalam SQL?

Ada beberapa cara Anda dapat mengubah data ini. Dalam posting asli Anda, Anda menyatakan bahwa PIVOT tampaknya terlalu rumit untuk skenario ini, tetapi dapat diterapkan dengan sangat mudah menggunakan UNPIVOT dan PIVOT fungsi di SQL Server.

Namun, jika Anda tidak memiliki akses ke fungsi tersebut, ini dapat direplikasi menggunakan UNION ALL ke UNPIVOT dan kemudian fungsi agregat dengan CASE pernyataan ke PIVOT :

Buat Tabel:

CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int);

INSERT INTO yourTable
    ([color], [Paul], [John], [Tim], [Eric])
VALUES
    ('Red', 1, 5, 1, 3),
    ('Green', 8, 4, 3, 5),
    ('Blue', 2, 2, 9, 1);

Gabungkan Semua, Agregat, dan Versi KASUS:

select name,
  sum(case when color = 'Red' then value else 0 end) Red,
  sum(case when color = 'Green' then value else 0 end) Green,
  sum(case when color = 'Blue' then value else 0 end) Blue
from
(
  select color, Paul value, 'Paul' name
  from yourTable
  union all
  select color, John value, 'John' name
  from yourTable
  union all
  select color, Tim value, 'Tim' name
  from yourTable
  union all
  select color, Eric value, 'Eric' name
  from yourTable
) src
group by name

Lihat SQL Fiddle dengan Demo

UNION ALL melakukan UNPIVOT data dengan mengubah kolom Paul, John, Tim, Eric menjadi baris terpisah. Kemudian Anda menerapkan fungsi agregat sum() dengan case pernyataan untuk mendapatkan kolom baru untuk setiap color .

Versi Statis Tanpa Pivot dan Pivot:

Keduanya UNPIVOT dan PIVOT fungsi di SQL server membuat transformasi ini lebih mudah. Jika Anda mengetahui semua nilai yang ingin Anda ubah, Anda dapat mengkodekannya menjadi versi statis untuk mendapatkan hasilnya:

select name, [Red], [Green], [Blue]
from
(
  select color, name, value
  from yourtable
  unpivot
  (
    value for name in (Paul, John, Tim, Eric)
  ) unpiv
) src
pivot
(
  sum(value)
  for color in ([Red], [Green], [Blue])
) piv

Lihat SQL Fiddle dengan Demo

Kueri dalam dengan UNPIVOT melakukan fungsi yang sama dengan UNION ALL . Dibutuhkan daftar kolom dan mengubahnya menjadi baris, PIVOT kemudian melakukan transformasi terakhir menjadi kolom.

Versi Pivot Dinamis:

Jika Anda memiliki jumlah kolom yang tidak diketahui (Paul, John, Tim, Eric dalam contoh Anda) dan kemudian jumlah warna yang tidak diketahui untuk diubah, Anda dapat menggunakan sql dinamis untuk menghasilkan daftar ke UNPIVOT lalu PIVOT :

DECLARE @colsUnpivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('yourtable') and
               C.name <> 'color'
         for xml path('')), 1, 1, '')

select @colsPivot = STUFF((SELECT  ',' 
                      + quotename(color)
                    from yourtable t
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
  = 'select name, '[email protected]+'
      from
      (
        select color, name, value
        from yourtable
        unpivot
        (
          value for name in ('[email protected]+')
        ) unpiv
      ) src
      pivot
      (
        sum(value)
        for color in ('[email protected]+')
      ) piv'

exec(@query)

Lihat SQL Fiddle dengan Demo

Versi dinamis menanyakan keduanya yourtable lalu sys.columns tabel untuk menghasilkan daftar item ke UNPIVOT dan PIVOT . Ini kemudian ditambahkan ke string kueri untuk dieksekusi. Kelebihan dari versi dinamis adalah jika Anda memiliki daftar color yang berubah-ubah dan/atau names ini akan menghasilkan daftar pada saat run-time.

Ketiga kueri akan menghasilkan hasil yang sama:

| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric |   3 |     5 |    1 |
| John |   5 |     4 |    2 |
| Paul |   1 |     8 |    2 |
|  Tim |   1 |     3 |    9 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server Ekspresi reguler di T-SQL

  2. CONVERT() di SQL Server

  3. Cara menghasilkan Script untuk Menambahkan Batasan Default ke Kolom di Beberapa Tabel di Database SQL Server - Tutorial SQL Server / TSQL Bagian 94

  4. Bagaimana Cara Menggunakan UTF-8 Collation dalam database SQL Server?

  5. Memindahkan Tabel SQL Server ke Filegroup Berbeda