SQL動態日期列

需求:字符串

 

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

相關文章
相關標籤/搜索