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.
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