sql - 如何用乘数计算列的总和
问题描述
我为一个表创建了一个触发器,该表基本上总结了某个 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),我想用 .
解决方案
您要使用的公式,如果您想在不同行中的值之间制作乘积,则使用它。所以在你的情况下它不适用。您需要为每一行转换为基础货币 (?) 并更新该字段。
所以在你的情况下(不知道你的模式),我会说:
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)
推荐阅读
- arrays - Vue watch 数组推送相同的新旧值
- couchbase - Couchbase 中的 N1QL 查询和索引问题
- wordpress - 如果自定义字段等于页面标题,则自动选择父页面
- docker - Docker entrypoint can't find file
- android - Android BLE Streaming
- java - New file in linux environment with absolute path
- visual-studio - VS2015 - LNK1104 无法打开文件 'C:\gstreamer\1.0\x86_64\lib\glib-2.0'
- c++ - Multiple Callback registration causes Segmentation Fault in c++,
- javascript - 数组和 For 循环 JS 的逻辑问题
- vue.js - VueJS functional components (SFC): how to encapsulate code?