ALTER PROCEDURE YSQKGKSBU_GZTH @FSDate NVARCHAR(100), @FEDate NVARCHAR(100) AS BEGIN -- 声明变量 DECLARE @StartDate DATE; DECLARE @EndDate DATE; DECLARE @LastDate Date; -- 将输入的字符串日期转换为日期类型 SET @StartDate = CONVERT(DATE, @FSDate, 120); -- 假设输入的日期格式为 YYYY-MM-DD SET @EndDate = CONVERT(DATE, @FEDate, 120); -- 假设输入的日期格式为 YYYY-MM-DD -- 计算上一年的 12 月 31 日 SET @LastDate = DATEADD(YEAR, DATEDIFF(YEAR, 0, @StartDate) - 1, 0); -- 获取 @StartDate 的年份的 1 月 1 日 SET @LastDate = DATEADD(DAY, -1, DATEADD(YEAR, 1, @StartDate)); -- 获取上一年的 12 月 31 日 TRUNCATE TABLE YSQKGK_SBU_GZTH --获取期初的数据,并填充 INSERT INTO YSQKGK_SBU_GZTH([SBU],[年初到期应收款额],[其中_年初应收款专责小组]) SELECT SBU, 到期金额, CASE WHEN 收款人 = '应收款专责小组' THEN 到期金额 ELSE null END AS '其中_年初应收款专责小组' FROM ZRP_YingShouMingXi_yuyubo where 订单日期 <= @LastDate AND [到期金额] <> 0 --获取开始日期和结束日期的数据 INSERT INTO YSQKGK_SBU_GZTH([SBU],[本年到期应收款额],[其中_本年应收款专责小组]) SELECT SBU, 到期金额, CASE WHEN 收款人 = '应收款专责小组' THEN 到期金额 ELSE null END AS '其中_年初应收款专责小组' FROM ZRP_YingShouMingXi_yuyubo where [订单日期] >= @FSDate AND [订单日期] <= @FEDate AND [到期金额] <> 0 --进行分组合计,并重新将数据填充到YSQKGK_SBU_GZTH中 SELECT SBU, SUM(年初到期应收款额) AS 年初到期应收款额, SUM(其中_年初应收款专责小组) AS 其中_年初应收款专责小组, SUM(本年到期应收款额) AS 本年到期应收款额, SUM(其中_本年应收款专责小组) AS 其中_本年应收款专责小组 INTO #TEMP1 FROM YSQKGK_SBU_GZTH GROUP BY SBU TRUNCATE TABLE YSQKGK_SBU_GZTH INSERT INTO YSQKGK_SBU_GZTH([SBU],[年初到期应收款额],[其中_年初应收款专责小组],[本年到期应收款额],[其中_本年应收款专责小组]) SELECT * FROM #TEMP1 --记录本年到期应收款额的总和,并更新占比字段 DECLARE @SUMDQJE DECIMAL(23, 10); SELECT @SUMDQJE = SUM([本年到期应收款额]) FROM YSQKGK_SBU_GZTH UPDATE YSQKGK_SBU_GZTH SET [占比] = FORMAT(ROUND([本年到期应收款额] / @SUMDQJE * 100, 2), '0.##') + '%'; --更新变化字段 UPDATE YSQKGK_SBU_GZTH SET [变化] = ISNULL([本年到期应收款额],0) - ISNULL([年初到期应收款额],0) END