Как написать этот запрос со сводной таблицей в sql server?

#sql #sql-server #pivot

#sql #sql-сервер #сводная

Вопрос:

Я использую приведенный ниже запрос с использованием сводной таблицы.

у меня есть столбец year и столбец employee id в одной таблице

 Select [2013],[2014],Cast(CONVERT(NUMERIC(18,2),(CONVERT(NUMERIC(18,2),([2014]-[2013]))/CONVERT(NUMERIC(18,2),[2013])*100.00))as Varchar(50)) '%'AS Diff From
(Select [2013],[2014]
from
( Select Year,Count(EmployeeId)Cont from employee group by year) as sourcetable
Pivot ( sum(Cont) for [Year] in ([2013],[2014])) as pivotable )As A
  

я хочу, чтобы результат выглядел следующим образом: последние два года в виде столбцов и считался значением

 2013   2014

------   -----------

50       100
  

Я могу добиться этого, но мне пришлось жестко закодировать 2013, 2014 в pivot. Могу ли я получить динамически, как

если в таблице указаны годы 2011, 2012, то вывод должен быть таким, как показано ниже

 2011   2012

------   -----------

75       150
  

или, если годы, представленные в таблице, — 2015, 2014, тогда

 2015   2014

------   -----------

40      80
  

С уважением

Ответ №1:

Да, вы можете использовать динамический свод, который получает столбец и создает его, например

2-я ссылка для понимания

 DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName   ',','')
         QUOTENAME(Course)
FROM (SELECT DISTINCT Course FROM #CourseSales) AS Courses

--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
  N'SELECT Year, '   @ColumnName   '
    FROM #CourseSales
    PIVOT(SUM(Earning)
          FOR Course IN ('   @ColumnName   ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery