2012-01-23 31 views
1

我需要根據兩個日期之間的減法之前的月數來映射列。通過SQL分配動態列?

例子:2012-10-01 - 2010-10-01 = 24

我需要01.10.201201.10.2010之間分配24列(插入到一個臨時表),所有月份的名字=>十月,十一月,...十月。

每一列代表一個月是這樣的:

十月十一月十二月一月二月三月四月五月六月七月八月九月十月十一月十二月一月二月三月四月五月六月七月八月九月十月

table_Temporal

City  
Area  
Production => Oct,Nov,Dec...etc... 
Yield 

好的,我有一個名爲「生產」的數字,其中我按月顯示了分佈,這個時間稱爲「月收成。」

例如:

生產=>收穫日期 100 => '2010/10/02' 200 => '2011/11/01' 100 => '2012/10/10'

的結果集將是

enter image description here

有什麼建議?

+1

這聽起來是可行的,但可怕的你能不能給更喜歡啥子你正在嘗試做的信息。我們可以通過插入一個共同的臨時表,然後基於一個月或日期進行旋轉。 – JonH

+0

好的,我有一個名爲「生產」的數字,根據一個叫做「收穫月份」的時間,我將其按月分配。 例如: 生產=>收穫日期 100 => '2010/10/02' 200 => '2011/11/01' 100 => '2012/10/10' 的結果集將是 「Production」=> 2010-10 => = 2011-11> 2012-10 400 => 100 => 200 => 100 – ale

+0

我不相信您可以擁有相同的列名稱。每個都需要獨特。所以,你必須有其他的價值來確保你有一個唯一的列名。或者你可以有1 - 12月和1年的列,所以你總共有13列,每年一行(如果這符合你的模型)。 – Vinnie

回答

1

爲此,您將需要一張表,而不使用任何遊標或動態創建列。解決的辦法是轉動的結果得到最終的輸出

2010-10 2010-11 2010-12 2011-1... 
    50  100  25  70 

即年份和月份是什麼使列獨特的總和整個月完成,並放置在正確的列的組合。快速出現的一個問題是使用PIVOT時,需要列出列名。例如... PIVOT (SUM(Harvest)) FOR ([2011-10], [2011-11]...,但我們可以使用STUFFXML Path來避免這一切。

這是你可以做的,我使用了TEMP表,但是你可以改變它來引用你的真實表。首先表:

CREATE TABLE #Test 
(
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    TheDate datetime, 
    Harvest int 
) 

然後插入一些虛擬的數據:

INSERT INTO #Test(TheDate, Harvest) VALUES ('10/11/2011', 50) 
INSERT INTO #Test(TheDate, Harvest) VALUES ('10/11/2012', 100) 
INSERT INTO #Test(TheDate, Harvest) VALUES ('10/1/2011', 20) 
INSERT INTO #Test(TheDate, Harvest) VALUES ('12/11/2011', 50) 
INSERT INTO #Test(TheDate, Harvest) VALUES ('11/11/2011', 50) 
INSERT INTO #Test(TheDate, Harvest) VALUES ('11/12/2011', 150) 

顯示結果:

SELECT * FROM #Test 

結果是:

ID TheDate     Harvest 
1 2011-10-11 00:00:00.000 50 
2 2012-10-11 00:00:00.000 100 
3 2011-10-01 00:00:00.000 20 
4 2011-12-11 00:00:00.000 50 
5 2011-11-11 00:00:00.000 50 
6 2011-11-12 00:00:00.000 150 

這裏就是神奇發生:

DECLARE @listCol VARCHAR(2000) 
DECLARE @query VARCHAR(4000) 

SELECT @listCol = STUFF(( 
          SELECT DISTINCT 
          ],[' + ltrim(str(YEAR(TheDate))) + 
          '-' + CAST (MONTH(TheDate) as varchar(50)) 
          FROM  
        #Test 
        ORDER BY 
       '],[' + ltrim(str(YEAR(TheDate))) + '-' + 
          CAST(MONTH(TheDate) as varchar(50)) 
          FOR XML PATH('') 
            ), 1, 2, '') + ']' 
SET @query = 
'SELECT * FROM 
     (SELECT 
      ltrim(str(YEAR(TheDate))) + 
      ''-'' + CAST (MONTH(TheDate) as varchar(50)) AS TheCol, 
      Harvest 
      FROM 
      #Test 
      ) src 
     PIVOT (SUM(Harvest) FOR TheCol 
     IN ('[email protected]+')) AS pvt' 

然後執行此查詢:

EXECUTE (@query)

結果:

2011-10 2011-11  2011-12 2012-10 
70   200   50 100 

而且不要忘記擺脫臨時表

DROP TABLE #Test

請記住我正在使用我的測試數據,因此您可以隨意添加。這是一切的圖形輸出:

enter image description here