U moet het jaar voor elk van uw datumwaarden krijgen en vervolgens op die waarden DRAAIEN. Je kunt een aantal verschillende functies in SQL Server gebruiken om dit te krijgen.
Elk van deze zal het jaar voor elke datum retourneren, u plaatst dan de jaren in uw PIVOT als de nieuwe kolommen.
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;
Zie Demo
. U zult zien dat ik in deze zoekopdracht de kolom mua.Id
. heb verwijderd . Dit komt omdat wanneer u gegevens draait, u op elke kolom in uw query groepeert, aangezien deze waarden verschillend zijn, u verschillende rijen retourneert. Door de kolom uit uw zoekopdracht te verwijderen, krijgt u een resultaat:
| 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 |
Tot slot, als je een onbekend aantal datums wilt hebben, raad ik twee dingen aan:gebruik een kalendertabel en vervolgens dynamische SQL.
Dan is de kalendertabel slechts een lijst met datums die u kunt gebruiken voor zoekopdrachten, vergelijkbaar met:
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'
Je zou dan een lijst van de jaren in een sql-tekenreeks maken en die tekenreeks uitvoeren, vergelijkbaar met:
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;
Zie Demo