首页 > 解决方案 > 如何用乘数计算列的总和

问题描述

我为一个表创建了一个触发器,该表基本上总结了某个 ID 的总价,并在任何更改后更新另一个表。现在我需要计算不同的货币,每种货币都有自己的价值,我从另一个表中得到 CurrencyID 和它的价值。我需要将每个更新的价格乘以它的货币价值并总结整个价格。有人可以帮我吗?

触发器本身可以在没有货币的情况下正常工作,我已经查找了 "X*Y=EXP(LN(X)+LN(Y))" 公式。我正在考虑在新表中收集所有价格和货币乘数并乘以行,但我不知道该怎么做或如何使用公式!

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [CMS].[HoldingSum]
   ON  [CMS].[PartOfOneHoldingADeal]
   AFTER INSERT,DELETE,UPDATE
AS 
BEGIN
   SET NOCOUNT ON;
    declare @ChangedDataID uniqueidentifier;
    if exists (select * from inserted)  SET @ChangedDataID = (Select Top 1 inserted.IDHoldingADeal from inserted);
    else if exists (select * from deleted)  SET @ChangedDataID = (Select Top 1 deleted.IDHoldingADeal from deleted);

    UPDATE CMS.HoldingADeal
    SET PriceHoldingADeal = (Select Sum(PricePartOfOneHoldingADeal) total
            from CMS.PartOfOneHoldingADeal
             where PartOfOneHoldingADeal.IDHoldingADeal=@ChangedDataID)
    where HoldingADeal.IDHoldingADeal = @ChangedDataID;
END

我希望 out 是一个总价(可能是 bigint),我想用 .

标签: sqlsql-server

解决方案


您要使用的公式,如果您想在不同行中的值之间制作乘积,则使用它。所以在你的情况下它不适用。您需要为每一行转换为基础货币 (?) 并更新该字段。

所以在你的情况下(不知道你的模式),我会说:

UPDATE CMS.HoldingADeal
    SET PriceHoldingADeal = (Select Sum(PricePartOfOneHoldingADeal * c.rate) total
            from CMS.PartOfOneHoldingADeal p
            join currencies c
                on p.currencyId = c.id
            where PartOfOneHoldingADeal.IDHoldingADeal=@ChangedDataID)
    where HoldingADeal.IDHoldingADeal = @ChangedDataID;

考虑到您有一个转换为基础货币的汇率列。如果您的货币表不同,您可以修改它。此外,您需要确保您拥有所有货币,否则查询将失败。

如果您认为那里没有基础货币,则进行左连接而不是连接,并将 isnull 添加到您的值

isnull(PricePartOfOneHoldingADeal * c.rate,PricePartOfOneHoldingADeal)

推荐阅读