SQL動態日期列


需求:

 

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

 

 

 

 

 

 

       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM