MySQL计算查询

标签 mysql vb.net

我有这个表,只有两列,每条记录存储给定月份的利率:

id     rate
===========
199502 3.63
199503 2.60
199504 4.26
199505 4.25
...    ...
201704 0.79
201705 0.93
201706 0.81
201707 0.80
201708 0.14

基于这个费率,我需要创建另一个类似结构的累积费率表,其数据作为 YYYYMM(月/年)参数的函数计算,这样(这个公式在法律上是强制性的):

  1. 作为参数给出的月份的比率始终为 0(零)
  2. 上个月的比率始终为 1(一)
  3. 前几个月的费率将是 (1) 加上该给定月份与作为参数给出的月份之间的月份费率之和。

我将通过这个例子来阐明这个规则,给定参数201708:

SOURCE         CALCULATED
id     rate    id       rate
===========    =============
199502 3.63    199502 360.97 (1 + sum(rate(199503) to rate(201707)))
199503 2.60    199503 358.37 (1 + sum(rate(199504) to rate(201707)))
199504 4.26    199504 354.11 (1 + sum(rate(199505) to rate(201707)))
199505 4.25    199505 349.86 (1 + sum(rate(199506) to rate(201707)))
...    ...     ...    ...
201704 0.79    201704   3.54 (1 + rate(201705) + rate(201706) + rate(201707))
201705 0.93    201705   2.61 (1 + rate(201706) + rate(201707))
201706 0.81    201706   1.80 (1 + rate(201707))
201707 0.80    201707   1.00 (per definition)
201708 0.14    201708   0.00 (per definition)

现在我已经实现了一个 VB.NET 函数来读取源表并生成计算表,但这是在每台客户端计算机上在运行时完成的:

Public Function AccumRates(targetDate As Date) As DataTable
    Dim dtTarget = Rates.Clone
    Dim targetId = targetDate.ToString("yyyyMM")
    Dim targetIdAnt = targetDate.AddMonths(-1).ToString("yyyyMM")
    For Each dr In Rates.Select("id<=" & targetId & " and id>199412")
        If dr("id") = targetId Then
            dtTarget.Rows.Add(dr("id"), 0)
        ElseIf dr("id") = targetIdAnt Then
            dtTarget.Rows.Add(dr("id"), 1)
        Else
            Dim intermediates =
                Rates.Select("id>" & dr("id") & " and id<" & targetId).Select(
                    Function(ldr) New With {
                        .id = ldr.Field(Of Integer)("id"),
                        .rate = ldr.Field(Of Decimal)("rate")}
                    ).ToArray
            dtTarget.Rows.Add(
                dr("id"),
                1 + intermediates.Sum(
                    Function(i) i.rate))
        End If
    Next
    Return dtTarget
End Function

我的问题是如何将其作为查询放入数据库中,以便其他查询动态使用它,这些查询将使用这些累积利率将债务更新到任何给定日期。

非常感谢!

编辑

我设法创建一个返回我想要的数据的查询,现在我只是不知道如何封装它,以便可以从另一个查询中调用它,传递任何 id 作为参数(这里我使用 SET ... 语句完成此操作):

SET @targetId=201708;
SELECT 
    id AS id_acum,
    COALESCE(1 + (SELECT 
                    SUM(taxa)
                FROM
                    tableSelic AS ts
                WHERE
                    id > id_acum AND id < @targetId
                LIMIT 1),
            IF(id >= @targetId, 0, 1)) AS acum
FROM
    tableSelic
    WHERE id>199412;

那是因为我对 MySQL 还很陌生,我习惯了 MS-Access,其中参数化查询的创建非常简单。

最佳答案

例如:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL PRIMARY KEY
,rate DECIMAL(5,2) NOT NULL
);

INSERT INTO my_table VALUES
(201704,0.79),
(201705,0.93),
(201706,0.81),
(201707,0.80),
(201708,0.14);

SELECT *
     , CASE WHEN @flag IS NULL THEN @i:=1 ELSE @i:=@i+rate END i
     , @flag:=1 flag  
  FROM my_table
     , (SELECT @flag:=null,@i:=0) vars 
 ORDER 
    BY id DESC;
+--------+------+-------------+-------+------+------+
| id     | rate | @flag:=null | @i:=0 | i    | flag |
+--------+------+-------------+-------+------+------+
| 201708 | 0.14 | NULL        |     0 |    1 |    1 |
| 201707 | 0.80 | NULL        |     0 | 1.80 |    1 |
| 201706 | 0.81 | NULL        |     0 | 2.61 |    1 |
| 201705 | 0.93 | NULL        |     0 | 3.54 |    1 |
| 201704 | 0.79 | NULL        |     0 | 4.33 |    1 |
+--------+------+-------------+-------+------+------+
5 rows in set (0.00 sec)

关于MySQL计算查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45550808/

相关文章:

arrays - 在 .txt 文件中搜索数组 VB.net

.net - 插件架构 - 使 MDI 父窗体意识到 DLL 中的子项

mysql - 在 VB.net 中使用 MySQL Connector 回滚事务

mysql - 如何以相同的形式搜索和查看数据

php - 错误 : fetching data from mysql and showing in on the web

mysql - 数据库中的表,其中两者的组合是唯一的,但其中任何一个都不是

javascript - 关于 webapp 架构和 ReactJs 的建议

mysql - 两个连接的结果集排序

c# - VB.NET 必须实现错误

mysql - 如何将这个 mysql 查询更改为高效的查询