首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL请求,要按月分组的子选择的总和

SQL请求,要按月分组的子选择的总和
EN

Stack Overflow用户
提问于 2017-09-02 00:17:27
回答 3查看 50关注 0票数 0

我有三张桌子。为了让它更容易理解,我把它转换成了一些简单的东西,比如不同体育活动的时间表。

  1. 第一个表“运动”是不同的运动。它包含这项运动的id和名称。

代码语言:javascript
复制
Table "sports"
+----+-------+
| id | Sport |
+----+-------+
| 1  | Judo  |
+----+-------+
| 2  | Boxe  |
+----+-------+

第二个表“”是实际发生的不同类。每一节课都与一项运动和一次约会有关。它包含id、班级的日期、相关运动的id,以及一个唯一的id,它将日期和运动id结合在一起,使其具有唯一性。

代码语言:javascript
复制
table "classes"
+----+----------+------------+--------------+
| id | id_sport | dates      | unique_key   |
+----+----------+------------+--------------+
| 1  | 1        | 2017-03-10 | 1_2017-03-10 |
+----+----------+------------+--------------+
| 2  | 2        | 2017-03-10 | 2_2017-03-10 |
+----+----------+------------+--------------+
| 3  | 2        | 2017-03-17 | 2_2017-03-17 |
+----+----------+------------+--------------+

  1. 第三个表"appointment“收集所有存在的信息。它包含来过的人的名字、运动的id和类的唯一键。我知道,在这个表中,id_sport列是不必要的,因为我们可以在表classes中找到它。

代码语言:javascript
复制
Table "appointments"
+----+---------+----------+--------------+
| id | student | id_sport | id_class     |
+----+---------+----------+--------------+
| 1  | Tom     | 1        | 1_2017-03-10 |
+----+---------+----------+--------------+
| 2  | Sam     | 1        | 1_2017-03-10 |
+----+---------+----------+--------------+
| 3  | Mat     | 2        | 2_2017-03-10 |
+----+---------+----------+--------------+
| 4  | Mat     | 2        | 2_2017-03-17 |
+----+---------+----------+--------------+
| 5  | Tom     | 2        | 2_2017-03-10 |
+----+---------+----------+--------------+

我在试着整理一些数据。我试图找出每个月参加某项运动的人数。

通过这个请求,我尝试查找boxe类中的人数:

代码语言:javascript
复制
SELECT
MONTH(classes.dates) AS Month,
  (SELECT count(*)
   FROM appointments
   WHERE appointments.id_sport = sports.id AND appointments.id_class = 
classes.unique_key AND sports.id = 2 LIMIT 1) AS nb_appointment   
FROM sports
INNER JOIN classes ON classes.id_sport = sports.id
WHERE sports.id = 2
ORDER BY Month

这样的结果是

代码语言:javascript
复制
+-------+---------------+
| Month | nb_appointment|
+-------+---------------+
| 3     | 2             |
+-------+---------------+
| 3     | 1             |
+-------+---------------+

我需要的是: Month 3 => nb_appointment 3的总和

如果我也有一些月4,5等,它也会显示这些月份的预约总数。

我试着按月分组,但它没有广告预约数量,只是显示最后一次…

有什么想法吗?

下面是我尝试过的http://sqlfiddle.com/#!9/733782/1中的sql

我还尝试了将select封装在一个SUM中,但似乎仍然不起作用:http://sqlfiddle.com/#!9/2ae510/1

我从php/sql开始,如果这个问题看起来很愚蠢,很抱歉。

EN

回答 3

Stack Overflow用户

发布于 2017-09-02 00:58:25

代码语言:javascript
复制
select count(distinct student) , Month(c.dates)
   from appointment a 
   inner join classes c
   on a.id_class = c.unique_key
   where c.id_sports = 2
group by Month(c.date)
票数 1
EN

Stack Overflow用户

发布于 2017-09-02 00:29:09

实际上,您可以用子查询包装一个"SUM“:

代码语言:javascript
复制
SELECT
MONTH(classes.dates) AS Month,  
SUM(
(SELECT count(*)
   FROM appointment
   WHERE appointment.id_sport = sports.id 
   AND appointment.id_classes = classes.unique_key 
   AND sports.id = 2 LIMIT 1) 
) AS nb_appointment   
FROM sports
INNER JOIN classes ON classes.id_sport = sports.id
WHERE sports.id = 2
ORDER BY Month

这给出了答案3(你的帖子说你期望nb_appointments是5,但我认为它是3?)

票数 0
EN

Stack Overflow用户

发布于 2017-09-02 01:45:41

好的,最后它的工作方式是包装一个sum()并添加一个group by,如下所示:

代码语言:javascript
复制
SELECT
MONTH(classes.dates) AS Month,
SUM(
  (SELECT count(*)
   FROM appointment
   WHERE appointment.id_sport = sports.id AND appointment.id_classes = 
classes.unique_key AND sports.id = 2 LIMIT 1)
  )AS nb_appointment   
FROM sports
INNER JOIN classes ON classes.id_sport = sports.id
WHERE sports.id = 2
GROUP BY Month
ORDER BY Month

谢谢!

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

https://stackoverflow.com/questions/46004323

复制
相关文章

相似问题

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