Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie Pivot-Tabelle für Jahr in SQL?

Sie müssen das Jahr für jeden Ihrer Datumswerte abrufen und diese Werte dann PIVOTen. Sie können ein paar verschiedene Funktionen in SQL Server verwenden, um dies zu erhalten.

  • DatePart - Die Syntax wäre DatePart(year, yourDate)
  • Jahr - Syntax ist Year(yourDate)

Beide geben das Jahr für jedes Datum zurück, Sie platzieren die Jahre dann als neue Spalten in Ihrem 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;

Siehe Demo . Sie werden feststellen, dass ich in dieser Abfrage die Spalte mua.Id entfernt habe . Dies liegt daran, dass Sie beim Pivotieren von Daten nach jeder Spalte in Ihrer Abfrage gruppieren, da diese Werte unterschiedlich sind und Sie unterschiedliche Zeilen zurückgeben. Wenn Sie die Spalte aus Ihrer Abfrage entfernen, erhalten Sie ein Ergebnis:

|    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 |

Schließlich, wenn Sie eine unbekannte Anzahl von Daten haben, dann würde ich zwei Dinge vorschlagen - verwenden Sie eine Kalendertabelle und dann dynamisches SQL.

Dann ist die Kalendertabelle nur eine Liste von Daten, die Sie für Abfragen verwenden können, ähnlich wie:

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' 

Sie würden dann eine Liste der Jahre in einer SQL-Zeichenfolge erstellen und diese Zeichenfolge ausführen, ähnlich wie:

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;

Siehe Demo