2012-08-13 103 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個月前'等等嗎? – 2012-08-13 16:26:50

回答

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)