2015-10-20 3 views
1

Мне нужно получить итоговую сумму каждого счета на основе его последней записи (Billings_History), если история просто не отображает ту же информацию из исходной таблицы (Billings).Получить общее количество таблицы истории в запросе mysql

Биллингс

BILLCOD TOTAL 
BILL01 15.00 
BILL02 10.00 
BILL03 15.00 
BILL04 26.00 
BILL05 294.00 

Billings_History

HISTORYCOD BILLCOD TOTAL 
H001  BILL01 36.00 
H002  BILL01 5.00 -- USE Latest HISTORYCOD in case when BILLCOD is duplicated 
H003  BILL03 50.00 
H004  BILL05 204.00 

Мне нужен этот результат

BILL01 -10.00 
BILL03 35.00 
BILL05 -90.00 

Любая идея?

ответ

1

Вот альтернатива решению заданной @jarlh:

SELECT b.BILLCOD AS BILLCOD, t.TOTAL - b.TOTAL AS TOTAL 
FROM Billings b INNER JOIN 
(
    SELECT bh1.HISTORYCOD, bh1.BILLCOD, bh1.TOTAL 
    FROM Billings_History bh1 INNER JOIN 
    (
     SELECT BILLCOD, MAX(HISTORYCOD) AS MAXHISTORYCOD 
     FROM Billings_History 
     GROUP BY BILLCOD 
    ) bh2 
    ON bh1.HISTORYCOD = bh2.MAXHISTORYCOD AND bh1.BILLCOD = bh2.BILLCOD 
) t 
ON b.BILLCOD = t.BILLCOD 
+1

Еще раз спасибо, ваш ответ решить мою проблему. –

1

В подвыборном случае используется NOT EXISTS, чтобы вернуть последние TOTAL для каждого BILLCOD в таблице Billings_History.

Этот результат: правый стол таблицы LEFT JOIN. Используйте COALESCE для установки значения 0, если в правой таблице нет строки.

select b.BILLCOD, coalesce(bh.TOTAL,0) - b.TOTAL 
from Billings b 
left join (select BILLCOD, TOTAL 
      from Billings_History bh1 
      where not exists (select 1 from Billings_History bh2 
          where bh2.BILLCOD = bh1.BILLCOD 
           and bh2.HISTORYCOD > bh1.HISTORYCOD)) bh 
    on b.BILLCOD = bh.BILLCOD