Você precisará obter o ano para cada um dos seus valores de data e, em seguida, PIVOT nesses valores. Você pode usar algumas funções diferentes no SQL Server para obter isso.
Qualquer um deles retornará o ano para cada data, então você colocará os anos em seu PIVOT como as novas colunas.
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;
Veja Demonstração . Você notará que nesta consulta eu removi a coluna
mua.Id
. Isso ocorre porque ao dinamizar os dados, você agrupará por cada coluna em sua consulta, pois esses valores são distintos, você retornará linhas diferentes. Ao remover a coluna da sua consulta, você retornará um resultado:| 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 |
Finalmente, se você tiver um número desconhecido de datas, sugiro 2 coisas - use uma tabela de calendário e, em seguida, SQL dinâmico.
Então a tabela de calendário é apenas uma lista de datas que você pode usar para consultar semelhante a:
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'
Você então criaria uma lista dos anos em uma string sql e executaria essa string, semelhante a:
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;
Veja Demonstração