需求:字符串
已知表#TEMP2:object
材料名稱 日期 數量select
A1 2014-09-01 100循環
A1 2014-09-02 200im
.數據
.查詢
A2 2014-09-01 100di
A2 2014-09-02 300字符
.日期
.
A3 2014-09-01 400
A3 2014-09-02 500
.
.
輸入:開始日期(2014-09-01) 結束日期(2014-09-25)
結果顯示以下:
材料名稱,2014-09-01,2014-09-02,2014-09-03,2014-09-04,........................2014-09-25
A1 , 100 , 200 , 600 , 700 .......................900
A2 , 200 , 400 , 600 , 700 .......................900
A3 , 400 , 200 , 600 , 700 .......................900
注:以上數據不許確,只是舉例說明
第一步動態建立表:
--判斷表是否存在,存在則刪除
IF EXISTS(SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'Ds_IcmoplanT')
AND type IN ( N'U' ) )
BEGIN
DROP TABLE Ds_IcmoplanT
END
--定義
DECLARE
@Fstr NVARCHAR(1000),--組合字符串
@Sql NVARCHAR(1000),--結果
@FSDateS DATE,--開始日期
@FEDateS DATE --結束日期
--賦值
SET @FSDateS=@FSDate
SET @FEDateS=@FEDate
--循環得出組合字符串
WHILE @FSDateS<=@FEDateS
BEGIN
SET @Fstr= ISNULL(@Fstr,'')+''' '''+' as '''+CONVERT(VARCHAR(100),@FSDateS, 23)+''''+','
SET @FSDateS=DATEADD(DAY, 1, @FSDateS)
END
--去掉最後一個符號
SET @Fstr=SUBSTRING(@Fstr,1,LEN(@Fstr)-1)
SET @Sql='SELECT distinct 材料名稱,'+@Fstr+' into Ds_IcmoplanT FROM #TEMP2'
EXECUTE(@Sql)
--結果以下
--select * from Ds_Icmoplan
第二步動態對列賦值:
--定義
DECLARE
@SSql NVARCHAR(1000),--結果
@FSDateE DATE, --開始日期
@FEDateE DATE, --結束日期
@FDate VARCHAR(100), --賦值用
@FValue VARCHAR(100), --數量
@FCLnumber VARCHAR(255) --遊標標量
DECLARE X001 CURSOR FOR
SELECT 材料名稱 FROM Ds_Icmoplan
OPEN X001
FETCH NEXT FROM X001 INTO @FCLnumber
WHILE @@FETCH_STATUS = 0
BEGIN
/* cursor logic */
SET @FValue=''
SET @FSDateE=@FStartTime
SET @FEDateE=@FEndTime
SET @SSql=''
--循環查詢賦值
WHILE @FSDateE<=@FEDateE
BEGIN
SELECT @FValue=數量 FROM #TEMP2 WHERE FDateTime=@FSDateE AND 材料名稱=@FCLnumber
SET @FDate='['+CONVERT(VARCHAR(100),@FSDateE, 23)+']'
SET @SSql='UPDATE Ds_Icmoplan SET '+@FDate+'='+''''+@FValue+''''+' WHERE 材料名稱='+''''+@FCLnumber+''''
EXECUTE(@SSql)
SET @FValue=''
SET @FSDateE=DATEADD(DAY, 1, @FSDateE)
END
FETCH NEXT FROM X001 INTO @FCLnumber
END
CLOSE X001
DEALLOCATE X001
--結果以下
select * from Ds_Icmoplan