2017-01-06 5 views
0

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

SELECT month(o.ord_date) as month, COUNT(o.ord_id) as January, COUNT(o.ord_id) as February, COUNT(o.ord_id) as March, COUNT(o.ord_id) as April, 
COUNT(o.ord_id) as May, COUNT(o.ord_id) as June, COUNT(o.ord_id) as July, COUNT(o.ord_id) as August, COUNT(o.ord_id) as September, 
COUNT(o.ord_id) as October, COUNT(o.ord_id) as November, COUNT(o.ord_id) as December 
FROM hotels h, countries r, cities c, orders o LEFT JOIN trips t ON o.trp_id=t.trp_id 
WHERE o.ord_date>'2016-01-01' AND o.ord_date<'2017-01-05' AND t.spr_id IN ('34','68','53') 
     AND o.htl_id=h.htl_id AND h.ctr_id = r.ctr_id AND h.cty_id = c.cty_id AND r.ctr_id = 245 
GROUP BY month(o.ord_date) 
ORDER BY month ASC 

Ищу результате чего-то вроде этого:

 | Jan | Feb | March | Apr | May | Jun | Jul | Aug | Sept | Oct | Nov | Dec 
Jan  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Feb  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
March | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Apr  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
May  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Jun  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Jul  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Aug  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Sept | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Oct  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Nov  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 
Dec  | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 

Спасибо заранее.

EDIT: Вот определение заказов таблицы P.Salmon просил:

CREATE TABLE IF NOT EXISTS `orders` (
    `ord_id` int(11) NOT NULL AUTO_INCREMENT, 
    `ord_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `ord_deliv_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `trp_id` int(11) NOT NULL DEFAULT '0', 
    `htl_id` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`ord_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=35026 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 

здесь несколько полей, которые нужно было бы объяснить:

  1. ord_date дата, когда заказ был первым из
  2. ord_deliv_date даты когда заказ должен быть доставлен. В этом случае начнется дата, когда начнется отключение (см. trp_id).
  3. htl_id - ссылка на таблицу отелей, где хранятся ctr_id и cty_id.
+1

Рассмотрим обработку вопросов отображения данных в коде приложения – Strawberry

+1

Сначала заменить неявное соединяется с явным присоединяется. –

+0

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

ответ

0

Условное агрегирование может быть тем, что вам нужно. Если мы будем игнорировать стыки и условия, то

select month(ord_date), 
sum(case when month(ord_deliv_date) = 1 then 1 else 0 end) as Jan, 
sum(case when month(ord_deliv_date) = 2 then 1 else 0 end) as Feb, 
. 
. 
sum(case when month(ord_deliv_date) = 12 then 1 else 0 end) as Dec 
from orders 
group by month(ord_date) 
+0

Это именно то, что я искал. Спасибо, сэр! – amberbrew

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