Musisz pobrać rok dla każdej z wartości dat, a następnie przestawić te wartości. Aby to osiągnąć, możesz użyć kilku różnych funkcji SQL Server.
Każdy z nich zwróci rok dla każdej daty, a następnie umieścisz lata w swoim PIVOT jako nowe kolumny.
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;
Zobacz Demo
. Zauważysz, że w tym zapytaniu usunąłem kolumnę mua.Id
. Dzieje się tak, ponieważ gdy przestawiasz dane, grupujesz je według każdej kolumny w zapytaniu, ponieważ te wartości są różne, zwrócisz różne wiersze. Usuwając kolumnę z zapytania, zwrócisz wynik:
| 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 |
Na koniec, jeśli masz zamiar mieć nieznaną liczbę dat, sugeruję 2 rzeczy - użyj tabeli kalendarza, a następnie dynamicznego SQL.
Następnie tabela kalendarza to tylko lista dat, których możesz użyć do zapytań podobnych do:
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'
Następnie utworzysz listę lat w ciągu sql i wykonasz ten ciąg, podobnie jak:
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;
Zobacz Demo