如何使用乘数计算列的总和

时间:2019-05-21 09:34:01

标签: sql sql-server

我为一个表创建了一个触发器,该表基本上将某个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

我希望结果是一个总价格(可能是bigint),我想用来更新我的表。

1 个答案:

答案 0 :(得分:0)

要使用的公式,如果要在不同行中的值之间生成乘积,则使用该公式。因此,在您的情况下,它不适用。您需要为每一行转换为基础货币(?),然后更新该字段。

因此,在您的情况下(不知道您的架构),我会说:

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;

考虑到您有一个汇率栏可以转换为您的基础货币。如果您的货币表不同,您可以修改一下。另外,您还需要确保所有货币都在那里,否则查询将失败。

如果您认为此处没有基础货币,则进行左联接而不是联接,并为您的值添加一个isull

isnull(PricePartOfOneHoldingADeal * c.rate,PricePartOfOneHoldingADeal)