日付値ごとに年を取得してから、それらの値を PIVOT する必要があります。これを取得するには、SQL Server のいくつかの異なる関数を使用できます。
これらのいずれかが各日付の年を返すので、その年を 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 を使用します。
次に、Calendar テーブルは、次のようなクエリに使用できる単なる日付のリストです:
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;
プレ>デモ を見る