Bạn sẽ cần lấy năm cho từng giá trị ngày tháng của mình và sau đó PIVOT cho các giá trị đó. Bạn có thể sử dụng một số hàm khác nhau trong SQL Server để có được điều này.
Một trong hai thứ này sẽ trả về năm cho mỗi ngày, sau đó bạn sẽ đặt các năm trong PIVOT của mình dưới dạng các cột mới.
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;
Xem Demo
. Bạn sẽ nhận thấy rằng trong truy vấn này, tôi đã loại bỏ cột mua.Id
. Điều này là do khi bạn xoay dữ liệu, bạn sẽ nhóm theo từng cột trong truy vấn của mình, vì các giá trị này khác nhau nên bạn sẽ trả về các hàng khác nhau. Bằng cách xóa cột khỏi truy vấn của bạn, bạn sẽ trả về kết quả:
| 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 |
Cuối cùng, nếu bạn sắp có một số ngày không xác định, thì tôi đề xuất 2 điều - sử dụng bảng Lịch và sau đó sử dụng SQL động.
Sau đó, bảng Lịch chỉ là một danh sách các ngày mà bạn có thể sử dụng để truy vấn tương tự như:
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'
Sau đó, bạn sẽ tạo một danh sách các năm trong một chuỗi sql và thực thi chuỗi đó, tương tự như:
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;
Xem Demo