sql >> Database >  >> RDS >> Sqlserver

Hoe een draaitabel voor het jaar in SQL te draaien?

U moet het jaar voor elk van uw datumwaarden krijgen en vervolgens op die waarden DRAAIEN. Je kunt een aantal verschillende functies in SQL Server gebruiken om dit te krijgen.

  • DatePart - de syntaxis zou zijn DatePart(year, yourDate)
  • Jaar - syntaxis is Year(yourDate)

Elk van deze zal het jaar voor elke datum retourneren, u plaatst dan de jaren in uw PIVOT als de nieuwe kolommen.

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;

Zie Demo . U zult zien dat ik in deze zoekopdracht de kolom mua.Id . heb verwijderd . Dit komt omdat wanneer u gegevens draait, u op elke kolom in uw query groepeert, aangezien deze waarden verschillend zijn, u verschillende rijen retourneert. Door de kolom uit uw zoekopdracht te verwijderen, krijgt u een resultaat:

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

Tot slot, als je een onbekend aantal datums wilt hebben, raad ik twee dingen aan:gebruik een kalendertabel en vervolgens dynamische SQL.

Dan is de kalendertabel slechts een lijst met datums die u kunt gebruiken voor zoekopdrachten, vergelijkbaar met:

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' 

Je zou dan een lijst van de jaren in een sql-tekenreeks maken en die tekenreeks uitvoeren, vergelijkbaar met:

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;

Zie Demo




  1. Hoe ontdek ik de onderliggende query van een gerealiseerde weergave die ik heb gemaakt?

  2. selecteer meerdere rijen verschillende waarde uit dezelfde tabel

  3. Samenvoegconflict met primaire sleutel automatisch oplossen

  4. Verwijder rijen van een tabel die is opgegeven in een tekstbestand in Postgres