Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment faire pivoter le tableau pour l'année en SQL?

Vous devrez obtenir l'année pour chacune de vos valeurs de date, puis PIVOT sur ces valeurs. Vous pouvez utiliser plusieurs fonctions différentes dans SQL Server pour obtenir cela.

  • DatePart - la syntaxe serait DatePart(year, yourDate)
  • Année - la syntaxe étant Year(yourDate)

L'un ou l'autre renverra l'année pour chaque date, vous placerez ensuite les années dans votre PIVOT en tant que nouvelles colonnes.

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;

Voir Démo . Vous remarquerez que dans cette requête j'ai supprimé la colonne mua.Id . En effet, lorsque vous faites pivoter des données, vous regroupez chaque colonne de votre requête, puisque ces valeurs sont distinctes, vous renverrez des lignes différentes. En supprimant la colonne de votre requête, vous renverrez un résultat :

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

Enfin, si vous allez avoir un nombre inconnu de dates, je suggérerais 2 choses :utilisez une table de calendrier, puis SQL dynamique.

Ensuite, la table Calendrier n'est qu'une liste de dates que vous pouvez utiliser pour des requêtes similaires à :

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' 

Vous créeriez ensuite une liste des années dans une chaîne sql et exécuteriez cette chaîne, semblable à :

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;

Voir Démo