Выберите информацию из последнего элемента и присоединитесь к общей сумме

Предположим, что у меня есть таблица вроде этого:

id | даты | клиент | продажа

И хотите выбрать для каждого клиента:

  • количество покупок
  • последняя стоимость покупки
  • общий объем покупок, когда он имеет положительное значение

С помощью этой таблицы:

CREATE TABLE sales (
    id int auto_increment primary key, 
    dates date,
    customer int,
    sale int
);

И эти данные:

INSERT INTO sales
    (dates, customer, sale)
VALUES
    ('2012-01-01', 1, 2),
    ('2012-02-01', 1, 8),
    ('2012-03-01', 2, 1),
    ('2012-04-01', 2, 7),
    ('2012-05-01', 2, -5),
    ('2012-06-01', 1, 5)

Мои результаты должны быть:

customer | sales | last_sale
1           3        5
2           3        7

Я не могу понять, как это получить. Я достиг этого:

SELECT s.customer, COUNT(s.sale) total_sales, last_sale FROM sales AS s
JOIN
  (SELECT customer, sale last_sale FROM sales GROUP BY customer ORDER BY dates DESC) AS t
  ON t.customer=s.customer
GROUP BY s.customer

Но он не работает. Любые идеи о том, как получить эти данные?

Весь код находится в скрипт SQL

Ответ 1

Попробуйте это

SELECT a.customer, count(a.sale), max_sale
FROM sales a
INNER JOIN (SELECT customer, sale max_sale 
            from sales x where dates = (select max(dates) 
                                        from sales y 
                                        where x.customer = y.customer
                                        and y.sale > 0
                                       )

           )b
ON a.customer = b.customer
GROUP BY a.customer, max_sale;

SQL DEMO

Ответ 2

SELECT a.customer, 
       COUNT(a.sale) total_sales,
       c.sale
FROM   sales a
       INNER JOIN
        (
          SELECT  a.*
          FROM    sales a
                  INNER JOIN
                  (
                    SELECT  Customer, MAX(Dates) max_date
                    FROM    sales
                    WHERE   sale > 0
                    GROUP   BY Customer
                  ) b ON a.customer = b.customer AND
                          a.dates = b.max_date
        ) c ON a.customer = c.customer
GROUP  BY a.customer, c.sale