Ще трябва да получите годината за всяка една от вашите стойности за дата и след това да направите PIVOT на тези стойности. Можете да използвате няколко различни функции в SQL Server, за да получите това.
- DatePart
- синтаксисът би бил
DatePart(година, yourDate)
- Година
- синтаксисът е
Година (вашата дата)
Всеки от тях ще върне годината за всяка дата, след което ще поставите годините във вашия PIVOT като нови колони.
изберете плоча, [2011], [2012], [2013], [2014], [2015], [2016], [2017]from( SELECT tnk.Plate, Cast(mua.Tarih като дата) ) като M_Date, year(mua.Tarih) yr FROM Muayene mua LEFT JOIN Tanker tnk on (tnk.OID=mua.TankerId)) dpivot( max(m_date) for yr in ([2011], [2012], [2013] , [2014], [2015], [2016], [2017])) piv;
Вижте Демо
. Ще забележите, че в тази заявка премахнах колоната mua.Id
. Това е така, защото когато обобщавате данни, ще групирате по всяка колона в заявката си, тъй като тези стойности са различни, ще върнете различни редове. Като премахнете колоната от вашата заявка, ще върнете резултат:
И накрая, ако ще имате неизвестен брой дати, тогава бих предложил 2 неща - използвайте календарна таблица и след това динамичен SQL.
Тогава календарната таблица е просто списък с дати, които можете да използвате за заявки, подобно на:
създайте таблица calendar( date datetime);вмъкнете в calendarselect '2011-01-01' union allselect '2012-01-01' union allselect '2013-01-01' union allselect '2014-01-01 ' union allselect '2015-01-01' union allselect '2016-01-01' union allselect '2016-01-01' union allselect '2017-01-01' union allselect '2018-01-01'
След това ще създадете списък с годините в sql низ и ще изпълните този низ, подобно на:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)select @cols =STUFF((SELECT ',' + QUOTENAME(year(date)) from calendar group by year(date) red по година(дата) ЗА 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 'изпълни sp_executesql @query;
Вижте Демо