我正在尝试在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 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 |