2014-12-08 2 views
-1

У меня есть стол с 3 колонками (server varchar(20), transactions int(20), timestamp timestamp(0)). Есть несколько серверов, которые регистрируют транзакции, с которыми они попадают, в течение дня. Я хочу написать запрос, который суммирует максимальную транзакцию (в день) в течение нескольких месяцев и отображает столбец за каждый месяц.Возьмите максимум каждого дня и сумму mysql

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

SELECT IFNULL(server, 'TOTAL') AS Server, 
     FORMAT(SUM(MAX(CASE WHEN DATE(TIMESTAMP) >= DATE('2014-10-01') 
        AND DATE(TIMESTAMP) < DATE('2014-11-01') THEN transactions ELSE 0 END),0)) AS 'Oct - 2014', 
     FORMAT(SUM(MAX(CASE WHEN DATE(TIMESTAMP) >= DATE('2014-11-01') 
        AND DATE(TIMESTAMP) < DATE('2014-12-01') THEN transactions ELSE 0 END),0)) AS 'Nov - 2014', 
     FORMAT(SUM(MAX(CASE WHEN DATE(TIMESTAMP) >= DATE('2014-12-01') 
        AND DATE(TIMESTAMP) < DATE('2015-01-01') THEN transactions ELSE 0 END),0)) AS 'Dec - 2014', 
     '' AS 'Total' 
FROM transactionstable 
GROUP BY Server WITH ROLLUP; 

ответ

0

Вы хотите вложенные группы, бай от первой по дате и сервер, чтобы получить максимум, а затем сервер, чтобы получить sum(). Эскиз запроса:

select server, sum(maxt) 
from (select date(timestamp) as d, server, max(transactions) as maxt 
     from transactiontable tt 
     where date(timestamp) between @TIMESTAMP1 and @TIMESTAMP2 
     group by date(timestamp), server 
    ) t 
group by server; 

EDIT:

Вобщи условная агрегация во внешнем запросе:

select server, sum(maxt), 
     sum(case when year(timestamp) = 2014 and month(timestamp) = 11 then maxt end) as sum_201411, 
     sum(case when year(timestamp) = 2014 and month(timestamp) = 12 then maxt end) as sum_201412, 
     sum(case when year(timestamp) = 2015 and month(timestamp) = 1 then maxt end) as sum_201501 
from (select date(timestamp) as d, server, max(transactions) as maxt 
     from transactiontable tt 
     where date(timestamp) between @TIMESTAMP1 and @TIMESTAMP2 
     group by date(timestamp), server 
    ) t 
group by server; 
+0

Спасибо за быстрый ответ. Я хочу иметь отдельную колонку за каждый месяц, чтобы показать сумму (макс.), Например, последние 3 месяца. В вашем ответе будет отображаться только сумма (макс.) Для одного конкретного диапазона? –

+0

@ttran. , , Его можно легко адаптировать, чтобы иметь несколько столбцов, если хотите. –

+0

Это сработало! Я скептически относился к тому, что получал максимум каждого дня в течение месяца и суммировал его для каждого сервера. Большое спасибо за ваше время. –

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