आपको अपने प्रत्येक दिनांक मान के लिए वर्ष प्राप्त करना होगा और फिर उन मानों पर PIVOT करना होगा। इसे प्राप्त करने के लिए आप SQL सर्वर में कुछ भिन्न कार्यों का उपयोग कर सकते हैं।
इनमें से कोई एक प्रत्येक तिथि के लिए वर्ष लौटाएगा, फिर आप वर्षों को अपने PIVOT में नए कॉलम के रूप में रखेंगे।
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;
देखें डेमो
. आप देखेंगे कि इस क्वेरी में मैंने mua.Id
. कॉलम हटा दिया है . ऐसा इसलिए है क्योंकि जब आप डेटा पिवट करते हैं तो आप अपनी क्वेरी में प्रत्येक कॉलम द्वारा समूहित करेंगे, क्योंकि ये मान अलग हैं, इसलिए आप अलग-अलग पंक्तियां लौटाएंगे। अपनी क्वेरी से कॉलम हटाकर, आप एक परिणाम देंगे:
| 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 |
अंत में, यदि आपके पास अज्ञात तिथियां होने वाली हैं, तो मैं 2 चीजों का सुझाव दूंगा - एक कैलेंडर तालिका और फिर गतिशील SQL का उपयोग करें।
तब कैलेंडर तालिका केवल तिथियों की एक सूची है जिसका उपयोग आप निम्न के समान क्वेरी करने के लिए कर सकते हैं:
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'
फिर आप एक sql स्ट्रिंग में वर्षों की एक सूची बनाएंगे और उस स्ट्रिंग को निष्पादित करेंगे, जैसा कि:
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;
देखें डेमो