需求:
已知表#TEMP2:
材料名称 日期 数量
A1 2014-09-01 100
A1 2014-09-02 200
.
.
A2 2014-09-01 100
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