Mysql中外汇的余额计算问题

问题描述 投票:0回答:1

我正在尝试在mysql中制作一个用于预记账的当前余额系统。我以不同的货币创建收据并以不同的货币收取付款。我的主要货币是土耳其里拉 (TRY)。下表中的金额字段为外币本身的金额。我正在尝试使用 dovizKarsiligiTl 进行计算。 是的,我错过了

原表

id 梅布拉格 多维兹库鲁 多维兹卡尔西利吉 dovizID
452 -60 32,31 1938,63 2
455 100 35,14 3514 3
456 -300 1 300 1
dovizID 名字
1 尝试
2 美元
3 欧元
SET @TRY_balance := 0;
SET @USD_balance := 0;
SET @EUR_balance := 0;
id 金额 外汇等值Tl 汇率 dovizID 尝试_余额 美元余额 欧元_余额
452 -60 1938.63 32.31 2 0 1938.6 0
455 100 3514.00 35.14 3 0 1938.6 3514
456 -300 300 1 1 -300 1938.6 3514

在上表中,TRY_BAK?YE、USD_BAK?YE、EUR_BAK?YE 字段是虚拟的,也就是说,它们可以根据我们在每一行中执行的交易而变化。

上表现在是我的原始表,根据我的查询结果,我的余额字段不正确。

在第 1 行中,我欠 1938.6 TL,相当于 -60 美元。 在第2行,我支付了100欧元3514 TL,所以根据第2行的余额状况,我的债务应该已经完成,1575.4 TL应该成为债权人。 在第 3 行中,我欠了 300 TL,换来了 -300 TL,并且由于我在第 2 行中记入了 1575.4 TL,因此我应该成为 1275.4 TL 的债权人。据此,应形成下表。但是,我找不到将创建此表的查询。

id 金额 汇率 dovizID 尝试_余额 美元余额 欧元_余额
452 -60 32.31 2 0 1938.6 0
455 100 35.14 3 0 0 1575.4
456 -300 1 1 0 0 1275.4

这里的数据不是固定的而是可变的。可以从金额中的-+值了解付款或债务状况。每行中保留正的 TL 值作为外币等值。

我尝试用Chatgpt查询8个小时,但没有得到任何成功的结果。

我的错误查询如下

SELECT
id,
meblag,
dovizKuru,
dovizKarsiligi,
dovizID,
SUM( CASE WHEN dovizID = 1 THEN CASE WHEN meblag > 0 THEN @TRY_bakiye:= @TRY_bakiye + dovizKarsiligi ELSE @TRY_bakiye := @TRY_bakiye -1*dovizKarsiligi END ELSE 0 END ) OVER (ORDER BY islemTarihi asc ) AS trb,

SUM( CASE WHEN dovizID = 2 THEN CASE WHEN meblag > 0 THEN @USD_bakiye:= @USD_bakiye + @EUR_bakiye + @TRY_bakiye + dovizKarsiligi ELSE @USD_bakiye:= @USD_bakiye:= -1*dovizKarsiligi END ELSE 0 END ) OVER (ORDER BY islemTarihi asc ) AS usb,

SUM( CASE WHEN dovizID = 3 THEN CASE WHEN meblag > 0 THEN @EUR_bakiye:= @EUR_bakiye + dovizKarsiligi ELSE @EUR_bakiye:=@EUR_bakiye -1*dovizKarsiligi END ELSE 0 END ) OVER (ORDER BY islemTarihi asc ) AS eub

来自 伊斯莱姆勒 在哪里 al_islemler.cariID = 33 和 al_islemler.firmaID = 382 通过...分组 ID 订购依据 al_islemler.islemTarihi ASC, al_islemler.id DESC 限制 0, 10;

mysql
1个回答
0
投票

MySQL 8 引入了窗口函数,这非常方便

SELECT * 
  , 
  SUM(CASE WHEN dovizID =1 THEN  `amount` * `exchange rate` ELSE 0  END) OVER (ORDER BY `id`) as  `TRY_balance`,
   SUM(CASE WHEN dovizID =2 THEN  `amount` * `exchange rate` ELSE 0 END ) OVER (ORDER BY `id`) AS `USD_balance`,
   SUM(CASE WHEN dovizID =3 THEN  `amount` * `exchange rate` ELSE 0 END) OVER (ORDER BY `id`) AS  `EUR_balance` 
  
  FROM balance
id 金额 外汇等值Tl 汇率 dovizID 尝试_余额 美元余额 欧元_余额
452 -60 1938.63 32.31 2 0.00 -1938.60 0.00
455 100 3514.00 35.14 3 0.00 -1938.60 3514.00
456 -300 300.00 1.00 1 -300.00 -1938.60 3514.00

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.