У меня есть две таблицы MySQL. Первая таблица:
cost_id| cost_customer_id | cost_total | cost_date
1 | 1 | 50 | 2019-01-03
2 | 2 | 120 | 2019-02-03
3 | 1 | 70 | 2019-03-21
4 | 2 | 35 | 2019-04-03
5 | 3 | 14 | 2019-05-07
6 | 1 | 84 | 2019-06-03
Вторая таблица:
inv_id | inv_customer_id | inv_total | inv_date
1 | 1 | 150 | 2019-01-05
2 | 2 | 20 | 2019-02-06
3 | 1 | 90 | 2019-03-21
4 | 1 | 3 | 2019-04-03
5 | 3 | 94 | 2019-05-09
6 | 2 | 11 | 2019-06-08
7 | 1 | 99 | 2019-07-06
8 | 2 | 71 | 2019-08-04
9 | 1 | 45 | 2019-09-02
Итак, я хотел бы получить следующее:
customer_id | sum_inv_total | sum_cost_total | balance | avg_inv_date
1 | 387 | 204 | 183 | 2019-05-31
2 | 102 | 155 | -53 | null
3 | 94 | 14 | 80 | 2019-05-09
, т. Е. Получить среднее значение inv_date для каждого клиентапосле вычета затрат, заказанных inv_date, например, для клиента # 1;средняя inv_date открытых счетов-фактур:
inv_id | inv_customer_id | inv_total | inv_date | status
1 | 1 | 150 | 2019-01-05 | closed (still below cost)
3 | 1 | 90 | 2019-03-21 | open (reached total cost: 204)
4 | 1 | 3 | 2019-04-03 | open
7 | 1 | 99 | 2019-07-06 | open
9 | 1 | 45 | 2019-09-02 | open
Я могу попробовать следующий запрос, но для его завершения требуется слишком много времени и только для одного клиента:
SELECT
sum_cost_total,
SUM(inv_total_str) AS sum_inv_total ,
FROM_UNIXTIME(AVG(UNIX_TIMESTAMP(inv_date_str))) AS avg_inv_date
FROM
(
SELECT
o1.inv_total AS inv_total_str, o1.inv_date AS inv_date_str,
(
SELECT SUM(cost_total)
FROM company_costs
WHERE cost_customer_id = o1.inv_company_customer_id
) AS sum_cost_total
FROM invoices o1
INNER JOIN
invoices o2 ON o2.inv_id <= o1.inv_id AND o1.inv_company_customer_id = o2.inv_company_customer_id
WHERE
o1.inv_company_customer_id = 1 AND
o1.inv_total > 0
GROUP BY
o1.inv_id,
o1.inv_total
HAVING
SUM(o2.inv_total) > sum_cost_total
) t