2014-12-06 6 views
1

Я хочу сделать запрос в MySQL, чтобы получить сумму значения из каждого месяца в год.сумма стоимости каждого месяца года

В настоящее время у меня есть что-то вроде этого:

SELECT 
    e.rfc as RFC, 
    SUM(f.total) AS Total, 
    MONTH(f.fecha) as Mes 
FROM 
    foo f 
INNER JOIN 
    bar e 
     ON f.bar_id = e.id 
INNER JOIN 
    baz u 
     ON e.baz_id = u.id 
WHERE 
    u.id = 3 
    AND DATE(f.fecha) BETWEEN '2014-01-01' AND '2014-12-31' 
GROUP BY 
    MONTH(f.fecha) 

Но в месяцах, где не существует значение Foo не отображается.

Мой результат атм это что-то вроде:

RFC    Total   Mes 
AAA010101AAA 10556.000000 12 
AAA010101BBB 1856.000000  11 
AAA010101BBB 66262.896800 10 
AAA010101BBB 990.090000  9 
AAA010101BBB 73.000000  8 
AAA010101BBB 1304761.620000 7 

Мой желаемого результата являются:

RFC    Total   Mes 
AAA010101AAA 10556.000000 12 
AAA010101AAA 0.0    11 
... (When no data it's available just return 0.0 for the month) 
AAA010101AAA 0.0    1 
AAA010101BBB 0.0    12 
AAA010101BBB 1856.000000  11 
AAA010101BBB 66262.896800 10 
AAA010101BBB 990.090000  9 
AAA010101BBB 73.000000  8 
AAA010101BBB 1304761.620000 7 
AAA010101BBB 0.0    6 
... 
AAA010101BBB 0.0    1 

Я хочу, чтобы заполнить таблицу, и мне нужно ноль, когда нет значения Foo не доступны суммы.

Спасибо.

+0

try, IFNULL (SUM (f.total), 0) AS Total –

+0

@AlwaysSunny, который не будет работать, мне нужно что-то, чтобы сгенерировать 12 месяцев, а затем суммировать только те, где есть данные для выполнения SUM() –

ответ

1

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

SELECT e.rfc as RFC, 
     SUM(CASE WHEN u.id = 3 THEN f.total ELSE 0 END) AS Total, 
     MONTH(f.fecha) as Mes 
FROM foo f INNER JOIN 
    bar e 
    ON f.bar_id = e.id INNER JOIN 
    baz u 
    ON e.baz_id = u.id 
WHERE DATE(f.fecha) BETWEEN '2014-01-01' AND '2014-12-31' 
GROUP BY MONTH(f.fecha) ; 

Если это не работает, вы должны начать с отводом вокруг left join и генерации строк за 12 месяцев каждого из них для каждого rfc.

EDIT:

Вот более болезненная версия:

select sum(total), m.m 
from (select distinct month(f.fecha) as m from foo where DATE(f.fecha) BETWEEN '2014-01-01' AND '2014-12-31') m left join 
    foo f 
    on month(f.fecha) = m.m left join 
    bar e 
    ON f.bar_id = e.id left join 
    baz u 
    ON e.baz_id = u.id and u.id = 3 
group by m.m 
order by m.m; 

Я не знаю, что делает значение rfc. Он исходит из произвольной строки и на самом деле не принадлежит к запросу.

+0

Здравствуйте @Gordon, у меня не всегда есть данные для пользователя в конкретный месяц (где запрос должен вернуться 0.0) –

+0

Это работает, если у вас есть данные для * любого * пользователя, а не только для пользователя, которого вы ищете. Пользователь не фильтрует, поэтому ему просто нужна информация о месяце. –

+0

Я вижу вашу мысль. Но ваше предложение возвращает тот же результат, что и исходный запрос. –

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