-1

我有如下表格:

create table company
(
    id int(10) unsigned not null auto_increment,
    name varchar(50) not null,
    primary key (id)
);

create table invoice
(
    id int(10) unsigned not null auto_increment,
    company_id int(10) unsigned not null,        
    invoice_number varchar(50) not null,
    paid_date datetime not null,
    paid_amount decimal(10, 2) not null,
    primary key (id),
    foreign key (company_id) references company(id)
);

create table company_rate
(
    id int(10) unsigned not null auto_increment,
    company_id int(10) unsigned not null,
    rate decimal(10, 2) not null,
    effective_date datetime not null,
    primary key (id),
    foreign key (company_id) references company(id)
);

公司表包含公司的名称。发票表包含发票编号、公司收到付款的日期和金额。公司费率表保存费率和费率生效的开始日期。例如,

company_id    rate    effective_date
-------------------------------------
1              100        0000-00-00
1              350        2013-07-01
1              450        2013-07-20
1              500        2014-01-01

如果当前日期是 07-03,那么汇率是 350,如果日期是 09-21,汇率是 450,依此类推。

我正在尝试根据这些表创建两个函数。

一种是通过选择公司来创建发票,并使用 html 表单或其他方式根据生效日期显示当前费率。

另一种是创建这样的列表:

company_name    invoice_number    rate    paid_amount    paid_date
-------------------------------------------------------------------
Apple           12345             300      300           2013-01-14
Apple           12346             500      400           2013-05-12
Intel           44441             1200     1350          2013-06-01

它打印发票信息,费率由paid_date 确定。

这是试过的:

SELECT c.name as company_name, i.invoice_number, r.rate, i.paid_amount, i.paid_date 
FROM invoice as i 
    LEFT JOIN company as c on c.id = i.company_id 
    LEFT JOIN (
        SELECT company_id, rate, effective_date 
            FROM  company_rate 
            WHERE effective_date IN (
                SELECT MAX(effective_date) 
                    FROM company_rate 
                        GROUP BY company_id
     )) AS r ON r.company_id = c.id 
         AND r.effective_date <= i.paid_date

我怎样才能做到这一点?

4

2 回答 2

0

一种可能的解决方案是使用相关子查询

SELECT c.name, invoice_number, 
       (SELECT rate
          FROM company_rate 
         WHERE company_id = i.company_id
           AND effective_date <= i.paid_date
         ORDER BY effective_date DESC
         LIMIT 1) rate,
       paid_amount,
       paid_date
  FROM invoice i JOIN company c
    ON i.company_id = c.id 

样本输出:

| 姓名 | INVOICE_NUMBER | 价格 | PAID_AMOUNT | PAID_DATE |
-------------------------------------------------- ---------------------------------
| 公司1 | 12345 | 100 | 300 | 2013 年 1 月 14 日 00:00:00+0000 |
| 公司1 | 12346 | 350 | 400 | 2013 年 5 月 12 日 00:00:00+0000 |
| 公司2 | 44441 | 1200 | 1350 | 2013 年 6 月 1 日 00:00:00+0000 |

这是SQLFiddle演示

于 2013-07-23T09:17:04.413 回答
0

由于您在 MySQL 标记下发布此内容,我认为您正在寻找“纯 sql”解决方案,所以这是我的建议。我会帮助你处理第一种情况,然后让你解决第二种情况(一旦你了解了如何解决第一种情况应该很容易)。

获取最新汇率。

因此,您希望根据“当前”日期获得最新费率。您可以使用子查询来实现这一点:

select 
    cr.*
from 
    company_rate as cr
    inner join (
        select company_id, max(date) as maxDate
        from company_rate
        where company_id = @yourCompanyId  -- Set (or replace) the variable with the desired value
          and date <= @yourDate  -- Set (or replace) the variable with the desired value
        group by company_id
    )
于 2013-07-22T23:59:17.720 回答