如何获取 Table 中给定日期范围内列的总和并使用 TSQL 中的总和更新 Table 中的特定单元格?

How To Get the Sum of a Column within a given Date range in a Table and Update a particular Cell in The Table with The Sum in TSQL?

我有一个名为 PersonalLedgerForTheiftFundAndShareClone 的 Table 我想获得 TInterest ( TheiftFundInterest ) 在日期范围内的总和2014-03-31 00:00:00.000 到每个员工的 2015-03-31 00:00:00.000 然后更新 TInterest 与该特定员工的日期为 2015-03-31 00:00:00.000 的总和。

我已经编写了一个存储过程来完成此任务,但无法获得所需的结果。

CREATE PROCEDURE UpdateTheiftFundInterest   
AS 
DECLARE @var1 VARCHAR(50), @var3 CURSOR, @var4 INT
SET @var1 = 0;
SET @var3 = CURSOR FOR
SELECT EmNo FROM [WBSEB].[dbo].[PersonalLedgerForTFundAndShareClone]
OPEN @var3
FETCH NEXT
FROM @var3 INTO @var1
WHILE @@FETCH_STATUS = 0
BEGIN
SET @var4 = 0;

SELECT @var4=SUM(TInterest)
FROM [WBSEB].[dbo].[PersonalLedgerForTFundAndShareClone]
WHERE TDate >= '2014-03-31 00:00:00.000' AND TDate <= '2015-03-31 00:00:00.000' 
AND EmNo = @var1

UPDATE [WBSEB].[dbo].[PersonalLedgerForTFundAndShareClone]
SET TInterest = @var4
Where TDate = '2015-03-31 00:00:00.000' AND EmNo = @var1

FETCH NEXT
FROM @var3 INTO @var1
END

CLOSE @var3
DEALLOCATE @var3
GO

谁能告诉我我做错了什么?

您正在使用光标,首先... 我会使用连接到派生 table 的更新语句。 这样的事情应该可以解决问题:

UPDATE t1
SET TInterest = SumTInterest
FROM PersonalLedgerForTFundAndShareClone t1
INNER JOIN
(
    SELECT EmNo, SUM(TInterest) AS SumTInterest
    FROM PersonalLedgerForTFundAndShareClone
    WHERE TDate >= '2014-03-31 00:00:00.000' 
    AND TDate <= '2015-03-31 00:00:00.000' 
    GROUP BY EmNo
) t2
ON(t1.EmNo = t2.EmNo)
WHERE TDate = '2015-03-31 00:00:00.000'

注意:这里直接写代码,可能会有一些错误。

您是否尝试避免使用游标并使用内部连接表更新...

UPDATE p
SET TInterest = x.ST
FROM [PersonalLedgerForTFundAndShareClone] p INNER JOIN 
(SELECT SUM(z.TInterest) ST, z.EmNo
FROM [PersonalLedgerForTFundAndShareClone] z
WHERE z.TDate >= '2014-03-31 00:00:00.000' AND z.TDate <= '2015-03-31 00:00:00.000' 
GROUP BY z.EmNo) x ON p.EmNo = x.EmNo
WHERE p.TDate = '2015-03-31 00:00:00.000'

可能是因为当您声明游标时您没有获得不同的员工编号列表,所以您最终会多次迭代同一员工。