Запрос MYSQL - получение итогов по месяцам

http://sqlfiddle.com/#!2/6a6b1

Схема приведена выше.. все, что я хочу сделать, это получить результаты как общее количество продаж/месяц... пользователь вводит дату начала и дату окончания, и я могу генерировать (в php) весь месяц и лет для этих дат. например, если я хочу узнать общее количество "продаж" за 12 месяцев, я знаю, что могу запускать 12 отдельных запросов с датами начала и окончания... но я хочу запустить только один запрос, где результат будет выглядеть как

Month     numofsale
January - 2  
Feb-1
March - 23
Apr - 10

и так далее.

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

Изменить/схему и данные, вставленные с sqlfiddle.com:

CREATE TABLE IF NOT EXISTS `lead_activity2` (
  `lead_activity_id` int(11) NOT NULL AUTO_INCREMENT,
  `sp_id` int(11) NOT NULL,
  `act_date` datetime NOT NULL,
  `act_name` varchar(255) NOT NULL,
  PRIMARY KEY (`lead_activity_id`),
  KEY `act_date` (`act_date`),
  KEY `act_name` (`act_name`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1  ;

INSERT INTO `lead_activity2` (`lead_activity_id`, `sp_id`, `act_date`, `act_name`) VALUES
(1, 5, '2012-10-16 16:05:29', 'sale'),
(2, 5, '2012-10-16 16:05:29', 'search'),
(3, 5, '2012-10-16 16:05:29', 'sale'),
(4, 5, '2012-10-17 16:05:29', 'DNC'),
(5, 5, '2012-10-17 16:05:29', 'sale'),
(6, 5, '2012-09-16 16:05:30', 'SCB'),
(7, 5, '2012-09-16 16:05:30', 'sale'),
(8, 5, '2012-08-16 16:05:30', 'sale'),
(9, 5,'2012-08-16 16:05:30', 'sale'),
(10, 5, '2012-07-16 16:05:30', 'sale');

Ответ 1

SELECT DATE_FORMAT(date, "%m-%Y") AS Month, SUM(numofsale)
FROM <table_name>
WHERE <where-cond>
GROUP BY DATE_FORMAT(date, "%m-%Y") 

Проверьте, что в вашей демонстрации для скриптов он работает для меня (удалите предложение where для тестирования)

SELECT DATE_FORMAT(act_date, "%m-%Y") AS Month, COUNT(*)
FROM lead_activity2
WHERE <where-cond-here> AND act_name='sale'
GROUP BY DATE_FORMAT(act_date, "%m-%Y") 

Он возвращает следующий результат

MONTH   COUNT(*)
07-2012 1
08-2012 2
09-2012 1
10-2012 3

Ответ 2

Вы можете попробовать выполнить запрос ниже

select  SUM(`SP_ID`) AS `Total` , DATE_FORMAT(act_date, "%M") AS Month, Month(`ACT_DATE`) AS `Month_number` from `lead_activity2`  WHERE `ACT_DATE` BETWEEN '2012-05-01' AND '2012-12-17' group by Month(`ACT_DATE`)

Здесь 2012-05-01 и 2012-12-17 - дата, введенная из формы. и он будет возвращать вам сумму продаж за конкретный месяц, если они существуют в базе данных.

спасибо

Ответ 3

Попробуйте этот запрос -

SELECT
  MONTH(act_date) month, COUNT(*)
FROM
  lead_activity2
WHERE
  YEAR(act_date) = 2012 AND act_name = 'sale'
GROUP BY
  month

Проверьте условие WHERE, если оно в порядке для вас - act_name = 'sale'.

Если вы хотите вывести имена месяцев, используйте MONTHNAME() вместо MONTH().

Ответ 4

SELECT YEAR(act_date), MONTH(act_date), COUNT(*)

FROM lead_activity2

GROUP BY YEAR(act_date), MONTH(act_date)

Для получения данных по месяцам или любых других данных на основе столбца вы должны добавить GROUP BY.

Вы можете добавить много столбцов или вычисленных значений в GROUP BY.

Я предполагаю, что "количество продаж" означает количество строк.

Ответ 5

Иногда вам могут понадобиться имена месяцев как Jan, Feb, Mar.... Dec возможно для диаграммы, например FusionChart

SELECT DATE_FORMAT(date, "%M") AS Month, SUM(numofsale)
FROM <Table_name>
GROUP BY DATE_FORMAT(date, "%M")

Результаты будут выглядеть так, как показано на таблице

MONTH   COUNT(*)
Jul       1
Aug       2
SEP       1
OCT       3