Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để xoay bảng cho năm trong SQL?

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.

  • DatePart - cú pháp sẽ là DatePart(year, yourDate)
  • Năm - cú pháp là Year(yourDate)

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CẤP THỰC HIỆN cho tất cả các thủ tục được lưu trữ

  2. Lập bản đồ điểm không gian địa lý trong Fluent NHibernate

  3. SQL Server - xác định cột kiểu XML với mã hóa UTF-8

  4. Cách tạo Ràng buộc khóa ngoại trên nhiều cột trong SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 67

  5. Tạo một UDF liên kết lược đồ trong SQL Server