SQL 查询按月排序和分组的数据

SQL query for data sorted and grouped by months

我正在研究一种方法来显示给定时间跨度内每个月的订单数以及其他一些限制因素。这是我的查询。

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

提前致谢。

编辑: 这是命令 table 定义 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_idcty_id 的酒店 table 的引用。

条件聚合可能就是您所需要的。 如果我们忽略连接和条件则

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)