如何获取 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'
可能是因为当您声明游标时您没有获得不同的员工编号列表,所以您最终会多次迭代同一员工。
我有一个名为 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'
可能是因为当您声明游标时您没有获得不同的员工编号列表,所以您最终会多次迭代同一员工。