Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да насоча таблица за година в SQL?

Ще трябва да получите годината за всяка една от вашите стойности за дата и след това да направите PIVOT на тези стойности. Можете да използвате няколко различни функции в SQL Server, за да получите това.

  • DatePart - синтаксисът би бил DatePart(година, yourDate)
  • Година - синтаксисът е Година (вашата дата)

Всеки от тях ще върне годината за всяка дата, след което ще поставите годините във вашия PIVOT като нови колони.

изберете плоча, [2011], [2012], [2013], [2014], [2015], [2016], [2017]from( SELECT tnk.Plate, Cast(mua.Tarih като дата) ) като M_Date, year(mua.Tarih) yr FROM Muayene mua LEFT JOIN Tanker tnk on (tnk.OID=mua.TankerId)) dpivot( max(m_date) for yr in ([2011], [2012], [2013] , [2014], [2015], [2016], [2017])) piv; 

Вижте Демо . Ще забележите, че в тази заявка премахнах колоната mua.Id . Това е така, защото когато обобщавате данни, ще групирате по всяка колона в заявката си, тъй като тези стойности са различни, ще върнете различни редове. Като премахнете колоната от вашата заявка, ще върнете резултат:

<предварителен код>| ПЛОЧКА | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 ||----------|------------|--------|--------|----- -------|------------|------------|------------|| 34VM7969 | 2011-08-02 | (нула) | (нула) | 08.08.2014 | 2015-02-21 | 2016-08-19 | 2017-03-09 |

И накрая, ако ще имате неизвестен брой дати, тогава бих предложил 2 неща - използвайте календарна таблица и след това динамичен SQL.

Тогава календарната таблица е просто списък с дати, които можете да използвате за заявки, подобно на:

създайте таблица calendar( date datetime);вмъкнете в calendarselect '2011-01-01' union allselect '2012-01-01' union allselect '2013-01-01' union allselect '2014-01-01 ' union allselect '2015-01-01' union allselect '2016-01-01' union allselect '2016-01-01' union allselect '2017-01-01' union allselect '2018-01-01'  

След това ще създадете списък с годините в sql низ и ще изпълните този низ, подобно на:

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)select @cols =STUFF((SELECT ',' + QUOTENAME(year(date)) from calendar group by year(date) red по година(дата) ЗА 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 'изпълни sp_executesql @query; 

Вижте Демо




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 - Свиване на регистъра на транзакциите - Има ли начин за автоматизиране?

  2. Високопроизводителен сървър - какво да използвам?

  3. Моделиране на данни за същите таблици с едни и същи колони

  4. SQL картографира влизане към съществуващ потребител

  5. „MOD“ не е разпознато име на вградена функция