已重新整理後發問,請直接查看這篇:
https://ithelp.ithome.com.tw/questions/10195041
問題:目前的學生數量只能算是人次(會重複計算),想詢問前輩們,若想得到有效不重複班級的學生數量總合要如何下sql比較好??
目標:取得各科各學期做統計,要能知道有哪些計畫、班級、受益學生多少的統計表
環境:php+mysql
資料表:
class 班級
class_id|class_schId| class_year |class_depId|class_grade|class_room|class_studentNbr
---|---
主鍵id|學校|學年度|科系id|年級|班級|學生數量
1|123|108|456|一|甲|30
2|123|108|456|二|乙|30
plan 計畫
plan_id|plan_schId| plan_year |plan_depId|plan_semester|plan_name|class_id
---|---
主鍵id|學校|學年度|科系id|學期|計畫名稱|班級id
1|123|108|456|1|計畫1|1
2|123|108|456|1|計畫1|2
3|123|108|456|1|計畫2|1
4|123|108|456|1|計畫2|2
目前的SQL
select plan_schId,plan_depId,plan_semester
,group_concat(distinct plan_name) -- 計畫名稱
,group_concat(distinct concat(class_grade,'年',class_room,'班')) -- 班級(不重複)
,sum(class_studentNbr) -- 學生人數
from plan
inner join class on plan.class_id = class.class_id
group by plan_schId,plan_depId,plan_semester
預期結果
學校|學年度|科系|學期|計畫|班級|學生人數
---|---
123|108|456|1|計畫1,計畫2|一年甲班,二年乙班|60
123|108|456|2|計畫1,計畫2|一年甲班,二年乙班|60
先使用子查詢完成對於plan
和class
的聚合計算.
在使用JOIN
關聯兩個子查詢結果集
select
t1.plan_schId,
t1.plan_depId,
t1.plan_semester,
t1.plan_name, -- 計畫名稱,
t2.class_room, -- 班級(不重複),
t2.class_studentNbr -- 學生人數
from (
select class_id,
plan_depId,
plan_schId,
plan_semester,
group_concat(distinct plan_name) plan_name
from plan
GROUP BY class_id,
plan_depId,
plan_schId,
plan_semester
) t1
inner join (
SELECT class_id,
group_concat(distinct concat(class_grade,'年',class_room,'班')) class_room,
sum(class_studentNbr) class_studentNbr
FROM class
GROUP BY class_id
) t2 on t1.class_id = t2.class_id