按语句

时间:2017-10-28 13:39:55

标签: sql sql-server

如何在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_StudentTb_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

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;

日期和地点不计算在内。