2013-10-21 4 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의 값에 따라가 열이 . 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 

만 3 월 열은 4 ~ 2,013의 첨가로 표시되는 5 ~ 2013 쥰 2,013 열 값 (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 
관련 문제