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;
这里有几个字段需要解释:
ord_date
首次下单日期
ord_deliv_date
订单应交付的日期。在这种情况下,旅行的开始日期(在 trp_id
中引用)。
htl_id
是对存储 ctr_id
和 cty_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)
我正在研究一种方法来显示给定时间跨度内每个月的订单数以及其他一些限制因素。这是我的查询。
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;
这里有几个字段需要解释:
ord_date
首次下单日期ord_deliv_date
订单应交付的日期。在这种情况下,旅行的开始日期(在trp_id
中引用)。htl_id
是对存储ctr_id
和cty_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)