2012-08-13 3 views
2

내가 임시 테이블에 다음 열을 채우는 SQL 쿼리를 작성했습니다 :분할 SQL 쿼리/월

CODE | MODULE | MONTH | YEAR | SO_NUM | LABOR_HRS | LABOR_COST 

을이 표에서를, 나는 동일한 데이터를 반환하는 SELECT 문을 작성해야합니다, 다음과 같이 월별로 분할합니다.

CODE | MODULE | SO_NUM_MONTH1 | LABOR_HRS_MONTH1 | LABOR_COST_MONTH1 | SO_NUM_MONTH2 | LABOR_HRS_MONTH2 | LABOR_COST_MONTH2 | etc... 

코드 및 모듈은 알 수있는 바와 같이 변경되지 않습니다. 임시 테이블에는 항상 6 개월 분량의 데이터가 있습니다. 그러나, 저를 얻는 무엇이 달이 항상 1에서 시작하지 않는다이다 (달과 년은 정수이다).

나는 또한 데이터가 2011 년 1 월부터 가정, 월 및 연도를 기준으로 명명 된 위의 예에서 그렇게 할 수있는 결과 열 싶습니다 이름이 될 수 있습니다

CODE | MODULE | SO_NUM_JAN_2011 | LABOR_HRS_JAN_2011 | LABOR_COST_JAN_2011 | SO_NUM_FEB_2011 | LABOR_HRS_FEB_2011 | LABOR_COST_FEB_2011 | etc... 

이 프로젝트 SQL Server 2008 R2에서 개발 중입니다.

+0

실제로 그런 식으로 이름이 지정된 열이 필요합니까? 또는 '5 개월 전', '4 개월 전'등의 작업을 수행 할 수 있습니까? –

답변

1

다음은 시작하기위한 몇 가지 코드입니다. 기본적으로 필요한 필드가있는 테이블을 생성하고 필요에 따라 테이블을 삭제하고 다시 작성할 수 있습니다. 나머지 필드를 동적 SQL 파트 (@CreateTable)에 추가하는 작업을 끝내야합니다. 그런 다음 삽입 및 업데이트 쿼리를 작성하여 채워야합니다. 나는 당신이 변수들로부터 필드 이름을 얻을 수 있도록 테이블을 생성하기 위해 사용했던 것처럼 동적 SQL을 사용할 것이다.

DECLARE @Month1 VARCHAR(15), 
@Month2 VARCHAR(15), 
@Month3 VARCHAR(15), 
@Month4 VARCHAR(15), 
@Month5 VARCHAR(15), 
@Month6 VARCHAR(15), 
@Year VARCHAR(4) 

SELECT @Year = Year(GetDate()) 

SELECT @Month1 = LEFT(DateName(mm,DateAdd(mm,-6,GetDate())),3) + '_' + @Year, 
@Month2 = LEFT(DateName(mm,DateAdd(mm,-5,GetDate())),3) + '_' + @Year, 
@Month3 = LEFT(DateName(mm,DateAdd(mm,-4,GetDate())),3) + '_' + @Year, 
@Month4 = LEFT(DateName(mm,DateAdd(mm,-3,GetDate())),3) + '_' + @Year, 
@Month5 = LEFT(DateName(mm,DateAdd(mm,-2,GetDate())),3) + '_' + @Year, 
@Month6 = LEFT(DateName(mm,DateAdd(mm,-1,GetDate())),3) + '_' + @Year 

PRINT @Month1 
PRINT @Month2 
PRINT @Month3 
PRINT @Month4 
PRINT @Month5 
PRINT @Month6 

DECLARE @CreateTable VARCHAR(MAX) 

SELECT @CreateTable = 'CREATE TABLE tblTESTING (
    CODE VARCHAR(10), 
    MODULE VARCHAR(10), 
    SO_NUM_' + @Month1 + ' VARCHAR(10), 
    LABOR_HOURS_' + @Month1 + ' VARCHAR(10), 
    LABOR_COST_' + @Month1 + ' VARCHAR(10) 
    )' 

PRINT ''  
PRINT @CreateTable 

--DROP TABLE tblTesting 

EXECUTE(@CreateTable)