数据表中有字段ID、计划值、实际值,想根据计划值,实际值获取完成率(需求:当实际值为0或者NULL是完成率为0%,当计划值为0或者NULL时完成率为100%,当计划值和实际值都不为0或者NULL时完成率=实际值/计划值)
现有表内容
目标结果
实现代码
USE test
GO
CREATE TABLE Test
(
ID INT PRIMARY KEY IDENTITY(1,1),
PlanValue DECIMAL(18,2),
RealValue DECIMAL(18,2),
)
INSERT INTO Test(PlanValue, RealValue) VALUES(100,15);
INSERT INTO Test(PlanValue, RealValue) VALUES(0,15);
INSERT INTO Test(PlanValue, RealValue) VALUES(100,0);
INSERT INTO Test(RealValue) VALUES(15);
INSERT INTO Test(PlanValue) VALUES(100);
INSERT INTO Test(PlanValue, RealValue) VALUES(0,0);
SELECT * FROM Test;
--创建存储过程、遍历临时
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE name='Proc_Test')
DROP PROCEDURE Proc_Test
GO
CREATE PROCEDURE Proc_Test
@MaxID int=5
AS
PRINT 'MaxID:'+CONVERT(NVARCHAR(50),@MaxID)
--创建结果临时表
CREATE TABLE #Temp_Result
(
ID INT,
PlanValue DECIMAL(18,2),
RealValue DECIMAL(18,2),
Rate DECIMAL(18,2),
)
SELECT ID,PlanValue,RealValue INTO #Temp_Test FROM Test WHERE ID<=@MaxID
WHILE EXISTS(SELECT id FROM #Temp_Test)
BEGIN
DECLARE @ID int, @PlanValue DECIMAL(18,2),@RealValue DECIMAL(18,2),@Rate DECIMAL(18,2)
SET ROWCOUNT 1
SELECT @ID=ID,@PlanValue=PlanValue,@RealValue=RealValue from #Temp_Test
IF (@RealValue IS NULL OR @RealValue=0)
SET @Rate=0
ELSE IF(@PlanValue IS NULL OR @PlanValue=0)
SET @Rate=100
ELSE
SET @Rate=@RealValue/@PlanValue
INSERT INTO #Temp_Result(ID,PlanValue,RealValue,Rate) VALUES(@ID,@PlanValue,@RealValue,@Rate)
SET ROWCOUNT 0
DELETE FROM #Temp_Test WHERE ID = @ID
END
SELECT * FROM #Temp_Result
GO
--调用存储过程
EXEC Proc_Test 6
服务器名称用 计算机名 而不是.或者IP地址
按F11进行调试
运行到存储过程
EXEC Proc_Test 6
按F11就进入到存储过程调试