-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 テーブルには、会社の名前が保持されます。Invoice テーブルには、請求書番号、会社が支払われる日付、および金額が保持されます。会社のレート テーブルには、レートと、レートが有効になる開始日が保持されます。例えば、

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 などです。

これらのテーブルに基づいて 2 つの関数を作成しようとしています。

1つは、会社を選択して請求書を作成し、HTMLフォームなどを使用して発効日に基づいて現在のレートを表示することです。

もう1つは、次のようなリストを作成することです。

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

これをMySQLタグの下に投稿しているので、「純粋なSQL」ソリューションを探していると思うので、ここに私の提案があります. 最初の状況については私がお手伝いし、2 番目の状況はあなたに解決してもらいます (最初の状況を解決する方法を理解すれば、簡単に解決できるはずです)。

最新のレートを取得します。

したがって、「現在の」日付に基づいて最新のレートを取得する必要があります。サブクエリを使用してこれを実現できます。

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 に答える