Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak przestawić tabelę przestawną na rok w SQL?

Musisz pobrać rok dla każdej z wartości dat, a następnie przestawić te wartości. Aby to osiągnąć, możesz użyć kilku różnych funkcji SQL Server.

  • DatePart - składnia to DatePart(year, yourDate)
  • Rok - składnia to Year(yourDate)

Każdy z nich zwróci rok dla każdej daty, a następnie umieścisz lata w swoim PIVOT jako nowe kolumny.

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;

Zobacz Demo . Zauważysz, że w tym zapytaniu usunąłem kolumnę mua.Id . Dzieje się tak, ponieważ gdy przestawiasz dane, grupujesz je według każdej kolumny w zapytaniu, ponieważ te wartości są różne, zwrócisz różne wiersze. Usuwając kolumnę z zapytania, zwrócisz wynik:

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

Na koniec, jeśli masz zamiar mieć nieznaną liczbę dat, sugeruję 2 rzeczy - użyj tabeli kalendarza, a następnie dynamicznego SQL.

Następnie tabela kalendarza to tylko lista dat, których możesz użyć do zapytań podobnych do:

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' 

Następnie utworzysz listę lat w ciągu sql i wykonasz ten ciąg, podobnie jak:

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;

Zobacz 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. Zapytaj SQL Server z SPSS, jak się połączyć

  2. Alias ​​odniesienia (obliczany w SELECT) w klauzuli WHERE

  3. Szybkie porady dotyczące naprawy i przywracania bazy danych SQL bez kopii zapasowej

  4. Pobieranie danych z MS SQL Server-2008 odwołujących się do wielu tabel

  5. Instrukcje SQL Server SELECT powodujące blokowanie