2014-11-05 6 views
0
/****** Script for SelectTopNRows command from SSMS ******/ 

declare @ActivityYear int = 2014 
declare @ActivityYear1 int = 2015 
declare @ActivityMonth int = 1 
declare @ActivityMonth1 int = 3 


Select FinancialCategory, ID, (CONVERT(varchar(5), ActivityMonth) + '-' 
    + CONVERT(varchar(5), ActivityYear)) As [Month-Year], Sum(HoursCharged) As [Hours] 
FROM Forecast 
where (ActivityMonth between @ActivityMonth and @ActivityMonth1) 
      AND (ActivityYear between @ActivityYear and @ActivityYear1) 
      AND FinancialCategory = 'Forecast' 

Group By FinancialCategory, ID,ActivityMonth, ActivityYear 

Это Выдает таблицу, которая выглядит следующим образом: Сводные строки в столбцы Динамически - SQL

И я хотел бы перенести его, чтобы иметь часы для каждого ID разразившегося по датам в диапазоне , Примечание: этот диапазон дат будет динамичным, я устанавливаю начальные даты для целей тестирования. enter image description here

ответ

1

В последнее время я немного узнал о динамическом шарнире, this post помог много. В качестве практики я преобразовал ваш, который, я думаю, будет выглядеть так, но не проверен, поскольку в данный момент у меня нет времени на создание таблиц и т. Д. НТН.

declare @ActivityYear int = 2014 
declare @ActivityYear1 int = 2015 
declare @ActivityMonth int = 1 
declare @ActivityMonth1 int = 3 

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX)  

select @cols = STUFF((SELECT distinct ',' + QUOTENAME((CONVERT(varchar(5), ActivityMonth) + '-' 
       + CONVERT(varchar(5), ActivityYear))) 
      FROM Forecast 
      WHERE (ActivityMonth between @ActivityMonth and @ActivityMonth1) 
       AND (ActivityYear between @ActivityYear and @ActivityYear1) 
       AND FinancialCategory = 'Forecast' 
     FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT FinancialCategory, ID, ' + @cols + ' FROM 
      (
       SELECT FinancialCategory, ID, (CONVERT(varchar(5), ActivityMonth) + ''-'' 
        + CONVERT(varchar(5), ActivityYear)) As [Month-Year],HoursCharged 
       FROM Forecast 
       WHERE (ActivityMonth between ' + @ActivityMonth + ' and ' + @ActivityMonth1 + ') 
          AND (ActivityYear between ' + @ActivityYear + ' and ' + 
          @ActivityYear1 + ') 
          AND FinancialCategory = ''Forecast'' 
      ) x 
      PIVOT 
      (
       Sum(HoursCharged) 
       for (CONVERT(varchar(5), ActivityMonth) + ''-'' 
        + CONVERT(varchar(5), ActivityYear)) in (' + @cols + ') 
      ) p ' 

execute(@query) 
+0

Я получаю сообщение об ошибке: Должен объявить скалярную переменную "@ActivityMonth". Я посмотрю на это завтра утром. – Megan

+0

ah Я вижу, что исправлена ​​эта ошибка, которую я получаю: Конверсия завершилась неудачно при преобразовании значения nvarchar ' \t SELECT FinancialCategory, SID, [1-2014], [1-2015], [2-2014], [2-2015 ], [3-2014], [3-2015] оТ ( ВЫБОР FinancialCategory, SID, ActivityMonth, ActivityYear, HoursCharged прогнозируемого где (ActivityMonth между "к типу данных Int. – Megan

+0

я нашел решение! я удалил where в '@query', тогда я получил синтаксическую ошибку, поэтому я изменил инструкцию SELECT в '@query', чтобы включить конверсии ... Я отредактирую ваше решение с моей ... Спасибо! – Megan