2

一時テーブルの次の列を埋める 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 で開発されています。

4

1 に答える 1

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)
于 2012-08-13T16:24:24.570 に答える