[英]SQL request, Sum of a subselect to group by month
我有3張桌子。 為了使它更容易理解,我將其轉換為簡單的內容,例如不同體育活動的時間表。
1.第一個表“體育”是不同的運動。 它包含此運動的ID和名稱。
Table "sports"
+----+-------+
| id | Sport |
+----+-------+
| 1 | Judo |
+----+-------+
| 2 | Boxe |
+----+-------+
2.第二個表“類”是實際發生的不同類。 每個類別都與一項運動和一個日期有關。 它包含ID,課程日期,與之相關的運動的ID,以及將日期和運動ID組合在一起以使其具有唯一性的唯一ID。
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 |
+----+----------+------------+--------------+
3.第三個表“約會”收集每個出席情況。 它包含來訪者的姓名,運動的ID和班級的唯一鍵。 我知道,在此表中不需要id_sport列,因為我們可以在表類中找到它。
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 |
+----+---------+----------+--------------+
我正在嘗試對一些統計數據進行排序。 我試圖找到每個月參加一項特定運動的人數。
有了這個請求,我嘗試找到參加拳擊課的人數:
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
結果是
+-------+---------------+
| Month | nb_appointment|
+-------+---------------+
| 3 | 2 |
+-------+---------------+
| 3 | 1 |
+-------+---------------+
我想要的是:月3的總和=> nb_appointment 3
如果我還有某個月4、5等,它還會顯示該月的約會總和。
我嘗試按月分組,但它沒有廣告約會的數量,只是顯示了最后一個...
有任何想法嗎 ?
這是我嘗試的SQL小提琴http://sqlfiddle.com/#!9/733782/1
我也嘗試將選擇內容包裝在SUM中,但仍然似乎不起作用: http : //sqlfiddle.com/#!9/2ae510/1
我是從php / sql開始的,如果這個問題看起來很蠢,對不起。
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)
您實際上可以在子查詢周圍包裝“ SUM”:
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 ??)
好的,最后它通過包裹sum()並添加一個group by來工作,就像這樣:
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
謝謝 !
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.