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

Bagaimana cara membuat tabel pivot selama setahun dalam SQL?

Anda harus mendapatkan tahun untuk setiap nilai tanggal Anda dan kemudian PIVOT pada nilai tersebut. Anda dapat menggunakan beberapa fungsi berbeda di SQL Server untuk mendapatkan ini.

  • DatePart - sintaksnya adalah DatePart(year, yourDate)
  • Tahun - sintaksnya adalah Year(yourDate)

Salah satu dari ini akan mengembalikan tahun untuk setiap tanggal, Anda kemudian akan menempatkan tahun di PIVOT Anda sebagai kolom baru.

select plate, [2011], [2012], [2013], [2014], [2015], [2016], [2017]
from
(
  SELECT tnk.Plate, 
     Cast(mua.Tarih as Date) as M_Date,
     year(mua.Tarih) yr
  FROM Muayene mua 
  LEFT JOIN Tanker tnk 
    on (tnk.OID=mua.TankerId)
) d
pivot
(
  max(m_date)
  for yr in ([2011], [2012], [2013], [2014], [2015], [2016], [2017])
) piv;

Lihat Demo . Anda akan melihat bahwa dalam kueri ini saya menghapus kolom mua.Id . Ini karena ketika Anda melakukan pivot data, Anda akan mengelompokkan menurut setiap kolom dalam kueri Anda, karena nilai ini berbeda, Anda akan mengembalikan baris yang berbeda. Dengan menghapus kolom dari kueri Anda, Anda akan mengembalikan hasil:

|    PLATE |       2011 |   2012 |   2013 |       2014 |       2015 |       2016 |       2017 |
|----------|------------|--------|--------|------------|------------|------------|------------|
| 34VM7969 | 2011-08-02 | (null) | (null) | 2014-08-08 | 2015-02-21 | 2016-08-19 | 2017-03-09 |

Terakhir, jika Anda akan memiliki jumlah tanggal yang tidak diketahui, maka saya akan menyarankan 2 hal - gunakan tabel Kalender dan kemudian SQL dinamis.

Maka tabel Kalender hanyalah daftar tanggal yang dapat Anda gunakan untuk kueri yang mirip dengan:

create table calendar
(
  date datetime
);

insert into calendar
select '2011-01-01' union all
select '2012-01-01' union all
select '2013-01-01' union all
select '2014-01-01' union all
select '2015-01-01' union all
select '2016-01-01' union all
select '2016-01-01' union all
select '2017-01-01' union all
select '2018-01-01' 

Anda kemudian akan membuat daftar tahun dalam string sql dan menjalankan string itu, mirip dengan:

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

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

set @query = 'SELECT plate, ' + @cols + ' 
            from 
            (
              select plate, 
                m_Date = convert(varchar(10), m_date, 120), 
                year(m_date) yr
              from yourquery
            ) x
            pivot 
            (
                max(m_date)
                for yr in (' + @cols + ')
            ) p '

execute sp_executesql @query;

Lihat Demo




  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 Dinamis (melewati nama tabel sebagai parameter)

  2. Bagaimana saya bisa membuat daftar semua kunci asing yang mereferensikan tabel yang diberikan di SQL Server?

  3. Periksa apakah Objek adalah Kunci Utama dengan OBJECTPROPERTY() di SQL Server

  4. Cara Memperbaiki "Fungsi partisi terkait menghasilkan lebih banyak partisi daripada grup file yang disebutkan dalam skema" Msg 7707 di SQL Server

  5. Bagaimana saya bisa membuat batasan unik SQL berdasarkan 2 kolom?