mssql 游标动态日期列

来源:互联网 发布:haoservice数据平台 编辑:程序博客网 时间:2024/06/15 15:06

需求:

已知表#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

 

原创粉丝点击