2015-10-25 4 views
2

мне нужно найти накопленную сумму для следующих данных:Почему продуцирующие MySQL накопленная сумма неправильных результатов

После запроса:

SELECT created, COUNT(*) 
FROM `transactions` 
GROUP BY created 

дает мне:

created COUNT(*) 
2015-8-09 1 
2015-8-15 1 
2015-8-16 2 
2015-8-17 1 
2015-8-23 1 

Я пытался суммировать сумму, как:

SELECT t1.created, COUNT(*) , SUM(t2.totalcount) AS sum 
FROM transactions t1 
INNER JOIN (

SELECT id, created c, COUNT(*) AS totalcount 
FROM transactions 
GROUP BY created 
ORDER BY created 
)t2 ON t1.id >= t2.id 
GROUP BY t1.created 
ORDER BY t1.created 

но результаты дает ARENT, как ожидалось:

created COUNT(*) sum 
2015-8-09 5 6 
2015-8-15 3 4 
2015-8-16 6 8 
2015-8-17 1 1 
2015-8-23 4 5 

Как я произвести следующий результат:

created COUNT(*) sum 
2015-8-09 1 1 
2015-8-15 1 2 
2015-8-16 2 4 
2015-8-17 1 5 
2015-8-23 1 6 
+1

Возможный дубликат [Создать накопленную сумму столбца в MySQL] (http://stackoverflow.com/questions/2563918/create-a-cumulative-sum-column-in-mysql) – e4c5

ответ

3
select tmp.*, @sum := @sum + cnt as cum_sum 
from 
(
    SELECT created, COUNT(*) as cnt 
    FROM `transactions` 
    GROUP BY created 
    ORDER BY created 
) tmp 
cross join (select @sum := 0) s 
2

Ваш внутренний запрос выбирает идентификатор без группировки на нем. Давайте переработаем его с точки зрения даты.

SELECT t1.created, COUNT(*) AS daycount, SUM(t2.totalcount) AS sum 
    FROM transactions t1 
INNER JOIN (SELECT created, COUNT(*) AS totalcount 
       FROM transactions 
       GROUP BY created 
      ) t2 ON t1.created >= t2.created 
GROUP BY t1.created 
ORDER BY t1.created; 

Или вы можете захотеть поставить TOTALCOUNT инлайн:

SELECT t1.created, COUNT(*) AS daycount 
    , (SELECT COUNT(*) FROM transactions t2 
      WHERE t2.created <= t1.created) AS totalcount 
    FROM transactions t1 
GROUP BY created 
ORDER BY CREATED; 
+0

приятно, отлично работает. Благодарю. –

+0

Другой ответ явно у кого-то, кто лучше понимает MySql (я парень Oracle) и, вероятно, будет более эффективным. Используйте это. –

Смежные вопросы