使用MySQL,如何根据半相关记录计算视图字段?

时间:2011-08-13 02:19:45

标签: mysql sql database-design

我很抱歉这个模糊的标题,但我想要做的事情几乎不能用单行描述。

我有一个简单的网络应用程序,带有MySQL 5.1.30后端,以帮助我管理我的财务状况。它有一个bill表:

id INT PRIMARY KEY,
date DATE

bill_rows表:

id INT,
bill INT REFERENCES bills (ID),
cost DECIMAL(16,2),
taxable TINYINT(1)

最后是taxed_bill_rows视图,其中引入了另一个taxes列:

SELECT
    r.id AS `id`,
    r.bill AS `bill`,
    r.cost AS `cost`,
    (CASE
        WHEN i.taxable
            THEN floor((r.cost * 1.05 * 1.075) * 100) / 100.00 - r.cost)
        ELSE
            0.00
    END) AS `taxes`
FROM bill_rows r

1.05因素是联邦税率,1.075是省税率。 (* 1.05 * 1.075不是一个错误:省税也适用于联邦税。)

但是,这些值不再是最新的(我实际上已经很晚了)。自今年1月1日 st 以来,联邦税率提高1%,最高为1.085

为了解决税率变化问题,我创建了一个新的tax_rates表:

ID INT,
date DATE,
federal DECIMAL(4,2),
provincial DECIMAL(4,2)

每次税率变化时,我都会在那里插入新记录。

现在问题是,如何从我的观点中根据账单的date字段获取相关税率?我不能只做LEFT JOIN tax_rates tr ON tr.date < b.date,因为这可能会带来太多记录。在tax_rates表中添加bills外键可以做到这一点,但是这些变化是偶然的,似乎不值得。

2 个答案:

答案 0 :(得分:1)

您的tax_rates表需要两个日期列来指示开始和放大端:

CREATE TABLE tax_rates (
  id INT,
  start_date DATE,
  end_date DATE,
  federal_tax_rate DECIMAL(4,2),
  provincial_tax_rate DECIMAL(4,2))

然后,您可以使用BETWEEN来加入:

JOIN tax_rates tr ON tr.date BETWEEN b.start_date AND b.end_date

答案 1 :(得分:0)

税率的预测关键将是最佳解决方案。

最佳性能和最佳维护,

任何其他解决方案都会变慢且不太可读

即您可以将字段start_date和end_date添加到tax_rates表中 和像

一样加入
left join tax_rates tr on b.`date` between tr.start_date and tr.end_date

在这种情况下,您还应该在start_date中为第一条记录保留0,为最后一条记录保留大日期