如何在distinct
语句中使用group by
关键字以这种方式在所有组中显示唯一值?
为了解释我的问题,请考虑以下场景:我在SQL Server中有三个表:
Tb_Student
存储学生的基本信息:
St_id St_Name St_University St_Faculty
--------------------------------------------------
1001 X KU Law
1002 y KU IT
1003 z KPU IR
Tb_Trainings
存储培训信息:
TrainingId TrainingName StartDate EndDate TrainingLocation
-----------------------------------------------------------------
1 SoftSkill 12/02/2017 12/03/2017 Office1
2 SoftSkill 25/02/2016 25/06/2016 Office1
3 CMOA 01/08/2017 01//09/2017 Main Office
Tb_St_Tr
这是Tb_Student
和Tb_Trainings
表之间的交集表并存储参与:
st_id training_id
-----------------------
1001 1
1002 1
1002 2
1003 2
1003 3
我需要在个人参与者的数量上显示培训信息。意思是,那些参加培训的人不止一次,应该记录下来。
我尝试了以下查询:
SELECT
t.trainingname,
t.startdate,
t.enddate,
t.traininglocation,
Count(DISTINCT s.st_id) total
FROM
tb_students s, tb_trainings t, tb_st_tr tr
WHERE
s.st_id = tr.st_id
AND tr.training_id = t.trainingid
GROUP BY
t.trainingname, t.startdate, t.enddate, t.traininglocation
结果是:
TrainingId TrainingName StartDate EndDate TrainingLocation total
--------------------------------------------------------------------------
1 SoftSkill 12/02/2017 12/03/2017 Office1 2
2 SoftSkill 25/02/2016 25/06/2016 Office1 2
3 CMOA 01/08/2017 01//09/2017 Main Office 1
然而,参与者甚至是那些不止一次参与的人。我怎样才能只展示个人(多次参加培训的参与者应该被计算一次),使用' distinct'关键字或任何其他方式有以下结果:
TrainingId TrainingName StartDate EndDate TrainingLocation total
--------------------------------------------------------------------------
1 SoftSkill 12/02/2017 12/03/2017 Office1 1
2 SoftSkill 25/02/2016 25/06/2016 Office1 1
3 CMOA 01/08/2017 01//09/2017 Main Office 1
答案 0 :(得分:0)
首先,从不在FROM
子句中使用逗号。 始终使用正确的,明确的JOIN
语法。这是21世纪。
其次,您不需要加入学生表来做您想做的事情,所以您的查询可能如下所示:
SELECT t.trainingname, t.startdate, t.enddate, t.traininglocation,
Count(DISTINCT tr.st_id) as num_students
FROM tb_trainings t JOIN
tb_st_tr tr
ON tr.training_id = t.trainingid
GROUP BY t.trainingname, t.startdate, t.enddate, t.traininglocation ;
这应计算每次培训会话的不同学生人数。如果你想要每个"培训名称"的不同号码,那么只需按以下方式汇总:
SELECT t.trainingname,
Count(DISTINCT tr.st_id) as num_students
FROM tb_trainings t JOIN
tb_st_tr tr
ON tr.training_id = t.trainingid
GROUP BY t.trainingname;
日期和地点不计算在内。