iT邦幫忙

0

[MySQL]想詢問若要取得有效的不重複數量,SQL要怎麼下比較好??

舜~ 2019-08-26 12:31:391479 瀏覽
  • 分享至 

  • xImage

已重新整理後發問,請直接查看這篇:
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

小魚 iT邦大師 1 級 ‧ 2019-08-26 12:43:26 檢舉
所以你希望的結果是什麼?
舜~ iT邦高手 1 級 ‧ 2019-08-26 13:24:17 檢舉
有效不重複班級的學生數量總合,文字已修
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
石頭
iT邦高手 1 級 ‧ 2019-08-26 13:17:17

先使用子查詢完成對於planclass的聚合計算.
在使用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

舜~ iT邦高手 1 級 ‧ 2019-08-26 14:05:51 檢舉

t2對單純對id做group感覺沒啥意義~~
雖然沒得到想要的結果,不過分開聚合計算再join的思路到個是好點子~

我要發表回答

立即登入回答