MYSQL - 如何计算每月发生的次数

时间:2017-07-20 15:13:24

标签: mysql

我有一个包含varchar列和datetime列的表,我希望从中获取一些计数:

CREATE TABLE `appointment` (
  `appointmentId` int(10) NOT NULL AUTO_INCREMENT,
  `cid` int(10) NOT NULL,
  `title` varchar(255) NOT NULL,
  `description` text NOT NULL,
  `location` text NOT NULL,
  `contact` text NOT NULL,
  `start` datetime NOT NULL,
  PRIMARY KEY (`appointmentId`));

一些值:

INSERT INTO `appointment` (`cid`, `title`, `description`, `location`, `contact`, `start`) 
VALUES 
('1', 'text1', ' ', ' ', ' ', '2017-07-21 16:00'),
('2', 'text1', ' ', ' ', ' ', '2017-08-21 16:00'),
('1', 'text1', ' ', ' ', ' ', '2017-09-21 16:00'),
('1', 'text1', ' ', ' ', ' ', '2017-09-21 16:00'),
('3', 'text2', ' ', ' ', ' ', '2017-07-21 16:00'),
('1', 'text3', ' ', ' ', ' ', '2017-07-21 16:00'),
('1', 'text4', ' ', ' ', ' ', '2017-07-21 16:00'),
('5', 'text5', ' ', ' ', ' ', '2017-07-21 16:00'),
('1', 'text1', ' ', ' ', ' ', '2017-07-21 16:00'),
('1', 'text1', ' ', ' ', ' ', '2017-07-21 16:00'),
('1', 'text3', ' ', ' ', ' ', '2017-07-21 16:00');

我想要完成的是计算一个'标题的出现次数。在每个月的基础上。像这样:

Month       | title | count 
--------------------------- 
July        | text1  | 3 
August      | text1  | 1  
September   | text1  | 2 
July        | text2  | 1 
etc...

我已经到了

SELECT  MONTHNAME(start) AS 'MONTH',
    title AS 'TITLE',
    count(title) AS 'COUNT'
FROM appointment
GROUP BY TITLE

但是,这是将所有text1分组到发生的第一个月的总计数中。因此,对于上面的示例,它显示:' July | text1 | 6'

我已经对该查询尝试了多种变体,但我显然遗漏了一些内容。

有人可以解释一下: a)为什么将所有这些汇总到一个月? 和b)如何让查询产生我想要的结果?

2 个答案:

答案 0 :(得分:1)

不确定您是否尝试过此操作但需要按月分组,如:

SELECT  MONTH(start) AS MONTH,
    title AS TITLE,
    count(title) AS COUNT
FROM appointment
GROUP BY title,MONTH(start);

另外为什么在AS之后你需要报价??

答案 1 :(得分:0)

您需要按月份(开始)进行分组,以及GROUP BY Title, MonthName(start)

你之所以看到7月的文字1 6是因为所有的text1都被放到了7月,而不仅仅是7月。通常,选择的任何非聚合字段都应位于group by中。 mySQL扩展了组,当非聚合字段不在组中时,不会出现错误;而oracle,db2,SQL Server Postgresql等都会抛出错误。有一个设置可以在mySQL中禁用,这会导致你的SQL出错,因为monthname(start)不在group by中。

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html