2013-10-21 115 views
1

我在表中有以下數據。在SQL Server中動態添加列值

 
State P_Name  Product Apr-2013 May-2013 Jun-2013 July-2013 Aug-2013 Sep-2013 Oct-2013 Nov-2013 Dec-2013 Jan-2014 Feb-2014 Mar-2014 
=============================================================================================================================================================== 
s1  p1   pro1  1500  4587  5245  6541  9683  45878  65464  4444  4411  21452  223322 232322 
s1  p1   pro2  1500  4587  5245  6541  9683  45878  65464  4444  4411  21452  223322 232322 

現在前三列是靜態的,但值是動態的,剩餘的列名和值是動態的。與此有一個可變

Declare @MONTHS INT 
SET @MONTHS = 1--3/6/12 can be 1/3/6/12 as monthly/quater/half-year/fullyear 

現在取決於@MONTHS值I必須添加值以第一/第一至第三/第一至6 /第一至12列和僅顯示列。 IF

SET @MONTHS = 1 

然後上面的數據是結果。但

SET @MONTHS = 3 

然後期望的結果如下:

 
State P_Name  Product Jun-2013 Sep-2013 Dec-2013 Mar-2014 
======================================================================= 
s1  p1   pro1  11332  62102  74319  477096 
s1  p1   pro2  11332  62102  74319  477096 

這裏只第三月份列顯示與加入APR-2013,可-2013和Jun-2013柱值(在jun- 2013年專欄),同樣我想要6和12也在第6和第12列。 月份列號和行號都是動態的。 月份列的數量可能只有1/3/6/12的倍數。 在這方面需要幫助。 謝謝。

編輯: 以上表中的數據導出與PIVOT幫助另一個表。是否有可能之前/與PIVOT沒有循環..? 以下是PIVOT之前的數據。

 
state p_name product amount monthnames 
================================================ 
s1  p1  pro1  1500  apr-2013 
s1  p1  pro1  4587  may-2013 
s1  p1  pro1  5245  jun-2013 
and so on................ 
........................ 
+0

告訴我們你已經擁有了什麼。 – RBarryYoung

+0

對此沒有任何想法...... :(對於在一段時間後編輯的重要信息感到抱歉...... !!) – LeO

+0

這裏的網站規則之一:「*詢問代碼的問題必須證明對所解決問題的最小理解包括嘗試的解決方案,爲什麼他們沒有工作,以及預期的結果。「所以,至少要告訴我們你對靜態部分的瞭解,然後什麼時候可以改變它是動態的。 – RBarryYoung

回答

1

認爲這樣做。爲派生列添加列名可能有點棘手,但我認爲這是可能的。如果列數不是@month的倍數,還需要一些異常處理。我打電話給我的表States

declare @month int 
set @month = 3 

declare cur cursor for 
select name 
    from syscolumns 
where object_name(id) = 'States' 
    and colorder > 3 
order by colorder 

declare @count int, @col varchar(100), @sql varchar(max), @tmp varchar(max) 

set @count = 1 
set @sql = 'select State, P_Name, Product, 0' 
set @tmp = '' 

open cur 
fetch cur into @col 
while @@FETCH_STATUS = 0 begin 
    set @tmp = @tmp + '+' + @col 
    if @count = @month begin 
     set @sql = @sql + @tmp + ', 0' 
     set @tmp = '' 
     set @count = 0 
    end 

    set @count = @count + 1 

    fetch cur into @col 
end 

set @sql = substring(@sql, 1, len(@sql) - 3) + ' from States' 

exec(@sql) 

close cur 
deallocate cur