首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL -如何计算每月发生的次数

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

Stack Overflow用户
提问于 2017-07-20 23:13:24
回答 2查看 1.2K关注 0票数 0

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

代码语言:javascript
复制
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`));

一些值:

代码语言:javascript
复制
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');

我想要完成的是每月获得一个“标题”的出现次数的计数。如下所示:

代码语言:javascript
复制
Month       | title | count 
--------------------------- 
July        | text1  | 3 
August      | text1  | 1  
September   | text1  | 2 
July        | text2  | 1 
etc...

我已经走到了

代码语言:javascript
复制
SELECT  MONTHNAME(start) AS 'MONTH',
    title AS 'TITLE',
    count(title) AS 'COUNT'
FROM appointment
GROUP BY TITLE

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

我已经尝试了该查询的几种变体,但我显然遗漏了一些东西。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-20 23:23:02

您还需要按月份名称(开始)进行分组,以便GROUP BY Title, MonthName(start)。

你看到7月text1 6的原因是因为text1的所有内容都放在了7月份,而不仅仅是7月份。通常,任何非聚合字段在select中都应该在group by中。mySQL扩展了group by,当非聚合字段不在group by中时,不会抛出错误;而oracle、db2、SQL Server Postgresql和其他都会抛出错误。在mySQL中有一个可以禁用的设置,它会导致您的SQL出错,因为monthname(start)不在group by中。

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

票数 0
EN

Stack Overflow用户

发布于 2017-07-20 23:19:53

不确定您是否尝试过此方法,但您需要按月分组,如下所示:

代码语言:javascript
复制
SELECT  MONTH(start) AS MONTH,
    title AS TITLE,
    count(title) AS COUNT
FROM appointment
GROUP BY title,MONTH(start);

另外,为什么在AS之后还需要引号呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45218774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档