2013-06-04 3 views
0

У меня есть таблица в mysql со столбцами дата, доход, с доходами, генерируемыми в каждый день за текущий месяц Мне нужно превратить его в формат date, «сумма выручки до этой даты»Сумма Mysql за период до даты строки для каждой строки

я мог бы сделать это с

select max(date) as date, sum(revenue) as total_revenue_to_date from table where dayofmonth(date)<=1 
union 
select max(date) as date, sum(revenue) as total_revenue_to_date from table where dayofmonth(date)<=2 
....... 

и т.д., но хотелось бы, чтобы записать его в более удобном формате.

У кого-нибудь есть идеи?

asnwered: кратчайшим, легче следовать:

SELECT fulldate, 
(SELECT SUM(margin) FROM fact_agg_margin_live_daily d2 WHERE d1.fulldate>=d2.fulldate) AS margin 
FROM fact_agg_margin_live_daily d1 

ответ

2

Я сделал несколько тестов, так что вот мой пример:

имя таблицы = Materiales имя поля = id_material

Ряды: 1, 2, 3, 4, 6, 7, 9 (о id_material колонке)

Запрос используется:

ВЫБОР id_material, (SELECT SUM (id_material) ОТ Materiales М2 ГДЕ M1.id_material> = M2.id_material) КАК сума ОТ Materiales М1

Ожидаемый результат: столбец1 с током id, column2 с суммой результатов текущего id плюс предыдущий, и yep, он работает.

Вы можете изменить его в текущем сценарии как-то так:

Выбрать дату, (SELECT SUM (доход) от таблицы T2 WHERE T1.date> = T2.date) AS revenue_until_current_date ОТ таблицы T1

Это приведет к возврату каждой даты с доходом до этой даты. Если строки хранятся каждый день, они возвращаются каждый день с доходом этого дня плюс предыдущий.

+0

Пожалуйста, дайте только ответы, рассуждая о том, почему этот ответ разрешил проблему. Если вам нужен тестовый файл, вы можете попросить OP предоставить данные, которые можно использовать в sqlfiddle. – DRvanR

+0

собираюсь попробовать сейчас на моем столе – AdrianBR

+0

SELECT fulldate, (SELECT SUM (margin) FROM fact_agg_margin_live_daily M2 WHERE M1.fulldate> = M2.fulldate) AS suma FROM fact_agg_margin_live_daily M1; PERFECT – AdrianBR

1

Было бы гораздо проще использовать group by для запроса:

select max(date) as date, sum(revenue) as total_revenue_to_date 
from table 
group by dayofmonth(date) 

Вы хотите накопленную сумму (которая ваш запрос не делать). Вот один метод (как показано в течение месяца 30 дней):

select max(date) as date, sum(revenue) as total_revenue_to_date 
from t join 
    (select 0 as n union all select 1 union all select 2 union all select 3 union all select 4 union all 
     select 5 as n union all select 6 union all select 7 union all select 8 union all select 9 union all 
     select 10 as n union all select 11 union all select 12 union all select 13 union all select 14 union all 
     select 15 as n union all select 16 union all select 17 union all select 18 union all select 19 union all 
     select 20 as n union all select 21 union all select 22 union all select 23 union all select 24 union all 
     select 25 as n union all select 26 union all select 27 union all select 28 union all select 29 union all 
     select 30 
    ) n 
    on day(date) + n <= 30 
group by day(date) + n; 

Вы также можете сделать это, используя переменную:

select max(date) as date, sum(revenue) as total_revenue_to_date, 
     @sum := @sum + SUM(revenue) as cumsum 
    from table cross join 
     (select @sum := 0) const 
    group by dayofmonth(date) 
+0

IT будет возвращать то же значение для дохода. Мне нужен доход, суммированный за период до даты в строке, а не только для даты строки. – AdrianBR

+0

Мне в основном нужна переменная. в моем первоначальном запросе забыл <=, так что да, это было неправильно, но скорректировало его в ближайшее время. Переменная одна сидит для глаз в php :) Спасибо! – AdrianBR

+0

возвращает то же значение, что и исходный доход, хотя вам придется немного поиграть с ним.В основном возвращает то же самое, что «выбрать дату как дату, доход как total_revenue_to_date, доход как cumsum из таблицы» – AdrianBR

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