USE msdb; GO IF EXISTS (SELECT 1 FROM dbo.sysobjects WHERE id = OBJECT_ID(N‘‘) AND xtype=‘U‘) DROP TABLE DiskCapacityHistory; GO CREATE TABLE dbo.DiskCapacityHistory ( [Date_CD] INT , [DataBaseID] INT , [FileID] INT , [DataBaseName] sysname , [LogicalName] VARCHAR(32) , [FileTypeDesc] NVARCHAR(60) , [PhysicalName] NVARCHAR(260) , [StateDesc] NVARCHAR(60) , [MaxSize] NVARCHAR(32) , [GrowthType] NVARCHAR(8) , [IsReadOnly] INT , [IsPercentGrowth] SMALLINT , [Size] FLOAT , [Growth_MOM_RAT] FLOAT , [Growth_YOY_RAT] FLOAT , CONSTRAINT PK_DiskCapacityHistory PRIMARY KEY(Date_CD, DataBaseID, FileID) );
接下来,我们创建存储过程,负责来收集、统计这些数据库的文件的相关信息。关于环比/同比,正常情况一般是:
环比: (指标当前值 - 指标值(上个月同一天))/ 指标值(上个月同一天) 。
同比: (指标当前值 - 指标值(去年月同一天))/ 指标值(去年月同一天) 。
其实如果关注每天的数据文件变化情况,这个代码里面的环比、同比其实意义不大,其实我们可以这样定义环比、同比:
环比: (指标当前值 - 指标值(昨天))/指标值(昨天)。
同比: (指标当前值 - 指标值 (上个月))/指标值(上个月)
当然,你也可以把这四个指标都加上,对比参考,侧重点不同而已。
顺便吐槽一下:由于前两年一直使用ORACLE数据库,很少接触SQL SERVER,在实现上面功能的时候,我深深的体会到了ORACLE和SQL SERVER的巨大差距,如果用PL/SQL实现,那非常方便快捷,但是用T-SQL让我遇到了几个相当痛苦地方,下面顺便记录对比一下吧:
SELECT CAST(REPLACE(CONVERT(varchar(10),GETDATE(),120),‘-‘,‘‘) AS INT);
SELECT TO_CHAR(Date_CD, ‘YYYYMMDD‘) FROM DUAL;
2: 幸好SQL 2008还把ORACLE的MERGE的功能给模仿了过来,但是T-SQL缺少ORACLE数据库强大的分析函数LAG,如果有这个,我计算环比,同比就非常方便了,一个SQL就搞定了,下面是个例子,本想把ORACLE的SQL也做个例子展现,但是又要建表、造数,折腾起来比较麻烦。
原文:http://www.cnblogs.com/zhangyingai/p/7082486.html