按计数分组一次

时间:2015-10-01 16:57:54

标签: sql-server group-by

我的数据如下:

ClassId ClassName   StudentId   Subject     SubjectId  
-----------------------------------------------------
1         ESL        12         English      20  
1         ESL        13         Science      30  
1         ESL        12         Social       40  
1         ESL        12         Maths        50  

必需输出:参数是主题列值

ClassId ClassName   TotalStudents   SubjectIds   
-----------------------------------------------    
1        ESL         2               20, 40, 50, 30  

当一个学生攻读多个科目时,只计算一次学生,所以在上面的数据中,12个学生ID需要多个科目,所以只计算一次。 TotalStudents值为2(来自学生ID 12的1和来自学生ID 13的1)

我不是在寻找如何以逗号分隔的字符串显示subjectIds列值。

提前致谢

3 个答案:

答案 0 :(得分:0)

DISTINCT可以在聚合函数中应用。

SELECT COUNT(DISTINCT column_name)FROM table_name;

答案 1 :(得分:0)

如果您不需要显示SubjectId,则需要使用GROUP BY子句将结果集分组为ClassIdClassName

SELECT ClassId, ClassName, COUNT(distinct StudentId) as TotalStudents
FROM MyTable
GROUP BY ClassId, ClassName

请参阅 SqlFiddle

中的此示例

答案 2 :(得分:0)

COUNT DISTINCT然后使用STUFF结合主题

declare @temp table
(ClassId int,ClassName   nvarchar(max),StudentId   int,Subject nvarchar(max),    SubjectId  int)

insert into @temp values (1,'ESL',12,'English' ,     20 ) 
insert into @temp values (1,'ESL',13,'Science' ,     30 ) 
insert into @temp values (1,'ESL',12,'Social ' ,     40 ) 
insert into @temp values (1,'ESL',12,'Maths  ' ,     50 ) 

select ClassId,ClassName,COUNT(DISTINCT StudentId) CNT,
STUFF( (SELECT ',' + CAST(t1.SubjectId AS NVARCHAR) 
                             FROM @temp t1
                             WHERE StudentId = t1.StudentId
                             FOR XML PATH('')), 
                            1, 1, '') SubjectIdS
 from @temp 
GROUP BY ClassId,ClassName

输出

enter image description here