2017-10-25 8 views
0

ID_Numberごとに、bill_dateと2つのタイプの請求が発生します。私は各ID番号の最新の日付(最大日付)を返信し、2種類の請求金額を合計したいと考えています。だから、下の表に基づいて、それは返す必要があります:MySQL - 複数のエントリの列の2つの行からの最新の日付と合計の合計

|   1 | 201604 | 10.00  |  | 

|   2 | 201701 | 28.00  |  | 


tbl_charges 
+-----------+-----------+-----------+--------+ 
| ID_Number | Bill_Date | Bill_Type | Amount | 
+-----------+-----------+-----------+--------+ 
|   1 | 201601 | A   | 5.00 | 
|   1 | 201601 | B   | 7.00 | 
|   1 | 201604 | A   | 4.00 | 
|   1 | 201604 | B   | 6.00 | 
|   2 | 201701 | A   | 15.00 | 
|   2 | 201701 | B   | 13.00 | 
+-----------+-----------+-----------+--------+ 

可能な場合はその後、私は参加のための列としてID_NUMBERを使用して、別のクエリに参加して、これを行うことができるようにしたいです。ここでクエリを変更しますか?

注:最初は、約200万の別個のID_Numbersのクエリを約1,000万回実行するだけです。これらのIDに「IN」句を追加します。私が最終製品のために参加するとき、私は、それらの最新の日付を他のすべての参加可能性の中から得る方法を知る必要があります。 (すなわち、どのように私はID_NUMBER 1は、201604とない201601に参加することを得るのですか?)

答えて

1

私は無関係な行アウトNOT EXISTSフィルタNOT EXISTSGROUP BY

select, t1.id_number, max(t1.bill_date), sum(t1.amount) 
from tbl_charges t1 
where not exists (
    select 1 
    from tbl_charges t2 
    where t1.id_number = t2.id_number and 
     t1.bill_date < t2.bill_date 
) 
group by t1.id_number 

を使用するとGROUP BYは、合計を行います。別の楽しい方法は、タプルとinを使用することで、

select id_number, sum(c.amount) 
from tbl_charges c 
where c.date = (select max(c2.date) 
       from tbl_charges c2 
       where c2.id_number = c.id_number and c2.bill_type = c.bill_type 
       ) 
group by id_number; 

または::

+0

あなたはどこかにT2を宣言することを意味するのですか? – buttpee

+0

@buttpeeが修正されました –

+0

t2.bill_date> t1.bill_dateはありませんか?あなたが書かれている方法では、私は最も新しい日付ではなく、最も早い日付になります。 – buttpee

0

私はwhereにフィルタリングするために傾けられる

select id_number, sum(c.amount) 
from tbl_charges c 
where (c.id_number, c.bill_type, c.date) in 
      (select c2.id_number, c2.bill_type, max(c2.date) 
      from tbl_charges c2 
      group by c2.id_number, c2.bill_type 
     ) 
group by id_number; 
関連する問題