sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan pivotter man tabel for år i SQL?

Du skal få året for hver af dine datoværdier og derefter PIVOT på disse værdier. Du kan bruge et par forskellige funktioner i SQL Server for at få dette.

  • DatePart - syntaksen ville være DatePart(year, yourDate)
  • År - syntaks er Year(yourDate)

En af disse vil returnere året for hver dato, du vil derefter placere årene i din PIVOT som de nye kolonner.

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;

Se Demo . Du vil bemærke, at jeg i denne forespørgsel fjernede kolonnen mua.Id . Dette skyldes, at når du pivoterer data, vil du gruppere efter hver kolonne i din forespørgsel, da disse værdier er forskellige, vil du returnere forskellige rækker. Ved at fjerne kolonnen fra din forespørgsel, vil du returnere et resultat:

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

Til sidst, hvis du skal have et ukendt antal datoer, så vil jeg foreslå 2 ting - brug en kalendertabel og derefter dynamisk SQL.

Så er kalendertabel blot en liste over datoer, som du kan bruge til at forespørge svarende til:

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' 
 

Du ville derefter oprette en liste over årene i en sql-streng og udføre denne streng, svarende til:

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;
 

Se Demo




  1. Antal unikke værdier

  2. MINUS i MySQL?

  3. Alternativ til delvis (ikke-aggregeret kolonne) i gruppe efter [Ollivanders Inventory-problem på hackerrank]

  4. Næste nærmeste dato og klokkeslæt i MySQL