Vous devrez obtenir l'année pour chacune de vos valeurs de date, puis PIVOT sur ces valeurs. Vous pouvez utiliser plusieurs fonctions différentes dans SQL Server pour obtenir cela.
L'un ou l'autre renverra l'année pour chaque date, vous placerez ensuite les années dans votre PIVOT en tant que nouvelles colonnes.
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;
Voir Démo
. Vous remarquerez que dans cette requête j'ai supprimé la colonne mua.Id
. En effet, lorsque vous faites pivoter des données, vous regroupez chaque colonne de votre requête, puisque ces valeurs sont distinctes, vous renverrez des lignes différentes. En supprimant la colonne de votre requête, vous renverrez un résultat :
| 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 |
Enfin, si vous allez avoir un nombre inconnu de dates, je suggérerais 2 choses :utilisez une table de calendrier, puis SQL dynamique.
Ensuite, la table Calendrier n'est qu'une liste de dates que vous pouvez utiliser pour des requêtes similaires à :
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'
Vous créeriez ensuite une liste des années dans une chaîne sql et exécuteriez cette chaîne, semblable à :
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;
Voir Démo