2014-11-05 104 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幫了很多。作爲一種慣例,我轉換了你的,我認爲這看起來像這樣,但沒有測試,因爲我現在還沒有時間創建表等。 HTH。

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 2014-11-05 23:49:18

+0

啊我看到現在我得到的那個錯誤得到了修正:轉換nvarchar值' \t SELECT FinancialCategory,SID,[1-2014],[1-2015],[2-2014],[2-2015 ],[3-2014],[3-2015] FROM ( SELECT FinancialCategory,SID,ActivityMonth,ActivityYear,HoursCharged FROM預測 WHERE(ActivityMonth'之間爲數據類型int。 – Megan 2014-11-06 13:46:24

+0

我找到了解決方案!我刪除了'@query'中的where子句,然後我得到一個語法錯誤,所以我更改了'@query'中的SELECT語句以包含轉換...我將用我的編輯您的解決方案...謝謝! – Megan 2014-11-06 14:48:44