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

Menampilkan Kolom sebagai Baris di SQL Server 2005

Untuk mendapatkan hasil yang Anda inginkan, Anda harus terlebih dahulu UNPIVOT data dan kemudian PIVOT the Nilai DatePeriod`.

UNPIVOT akan mengubah beberapa kolom Transactions , Customers dan Visits menjadi beberapa baris. Jawaban lainnya menggunakan UNION ALL untuk unpivot tetapi SQL Server 2005 adalah tahun pertama UNPIVOT fungsi didukung.

Kueri untuk melepaskan data adalah:

select dateperiod,
  col, value
from transactions
unpivot
(
  value for col in (Transactions, Customers, Visits)
) u

Lihat Demo . Ini mengubah kolom Anda saat ini menjadi beberapa baris, sehingga datanya terlihat seperti berikut:

| DATEPERIOD |          COL | VALUE |
-------------------------------------
|   Jan 2012 | Transactions |   100 |
|   Jan 2012 |    Customers |    50 |
|   Jan 2012 |       Visits |   150 |
|   Feb 2012 | Transactions |   200 |

Sekarang, karena data dalam baris, Anda dapat menerapkan PIVOT the fungsi ke DatePeriod kolom:

select col, [Jan 2012], [Feb 2012], [Mar 2012]
from
(
  select dateperiod,
    t.col, value, c.SortOrder
  from
  (
    select dateperiod,
      col, value
    from transactions
    unpivot
    (
      value for col in (Transactions, Customers, Visits)
    ) u
  ) t
  inner join
  (
    select 'Transactions' col, 1 SortOrder
    union all
    select 'Customers' col, 2 SortOrder
    union all
    select 'Visits' col, 3 SortOrder
   ) c
    on t.col = c.col
) d
pivot
(
  sum(value)
  for dateperiod in ([Jan 2012], [Feb 2012], [Mar 2012])
) piv
order by SortOrder;

Lihat SQL Fiddle dengan Demo .

Jika Anda memiliki jumlah periode tanggal yang tidak diketahui maka Anda akan menggunakan SQL dinamis:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(dateperiod) 
                    from transactions
                    group by dateperiod, PeriodNumberOverall
                    order by PeriodNumberOverall
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT col, ' + @cols + ' 
             from 
             (
                select dateperiod,
                  t.col, value, c.SortOrder
                from
                (
                  select dateperiod,
                    col, value
                  from transactions
                  unpivot
                  (
                    value for col in (Transactions, Customers, Visits)
                  ) u
                ) t
                inner join
                (
                  select ''Transactions'' col, 1 SortOrder
                  union all
                  select ''Customers'' col, 2 SortOrder
                  union all
                  select ''Visits'' col, 3 SortOrder
                 ) c
                  on t.col = c.col
            ) x
            pivot 
            (
                sum(value)
                for dateperiod in (' + @cols + ')
            ) p 
            order by SortOrder'

execute(@query)

Lihat SQL Fiddle dengan Demo . Keduanya akan memberikan hasil:

|          COL | JAN 2012 | FEB 2012 | MAR 2012 |
-------------------------------------------------
| Transactions |      100 |      200 |      300 |
|    Customers |       50 |      100 |      200 |
|       Visits |      150 |      300 |      600 |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TSQL Query untuk mereferensikan baris sebelumnya

  2. Menghitung tanggal jatuh tempo menggunakan jam kerja dan hari libur

  3. Dapatkan Kolom yang Mendasari Tampilan Berdasarkan Kumpulan Hasil-nya

  4. Sql Server - terhubung dengan otentikasi windows

  5. DI Operator SQL