【问题标题】: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?如何获取表中给定日期范围内的列的总和,并使用 TSQL 中的总和更新表中的特定单元格?
【发布时间】:2015-09-03 18:01:21
【问题描述】:

我有一个名为PersonalLedgerForTheiftFundAndShareClone 的表 我想在 2014-03-31 00:00:00.0002015-03-31 00:00:00.000 的日期范围内得到 TInterest ( TheiftFundInterest ) 的总和 对于每个员工和然后使用日期为 2015-03-31 00:00:00.000 的特定员工的 Sum 更新 TInterest

我已经写了一个存储过程来完成这个任务,但是不能得到想要的结果。

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

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

【问题讨论】:

    标签: sql-server database tsql stored-procedures


    【解决方案1】:

    您正在使用光标,开始... 我会使用连接到派生表的更新语句。 像这样的东西应该可以解决问题:

    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'
    

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

    【讨论】:

      【解决方案2】:

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

      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'
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2020-06-12
          • 1970-01-01
          • 1970-01-01
          • 2020-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-15
          • 2020-10-30
          相关资源
          最近更新 更多