首页 > 解决方案 > 计数(不同)超过(分区)sql server 2016

问题描述

我有一张如下表

class_no 学生卡 主题名称
1 636 物理
1 636 化学
1 637 数学
1 638 德语
1 639 物理
Create table #T_Test(
     class_no int
     ,student_id int
     ,subject_name nvarchar(25)
);
Insert into #T_Test ([class_no],[student_id],[subject_name]) values
(1,636,'Physics'),
(1,636,'Chemistry'),
(1,637,'Maths'),
(1,638,'German'),
(1,639,'Physics')

我想得到不同student_id的计数,也计算grouped_by subject_names

class_no 主题名称 total_subjects 学生总数
1 物理 2 4
1 化学 1 4
1 数学 1 4
1 德语 1 4
1 物理 1 4

以下是我到目前为止所做的,如何获得结果集中包含的不同计数(student_id)

SELECT  DISTINCT t.class_no
        ,t.subject_name
        ,count(*) total_subject
FROM        #T_Test t
WHERE       t.class_no = 1
GROUP BY    t.class_no,subject_name

标签: sqlsql-serversql-server-2016

解决方案


通过使用这个小dense_rank技巧,无需多次点击表格即可获得科目的汇总和不同的学生人数:

with s as (
    select class_no, subject_name,
    Dense_Rank() over (partition by class_no order by student_id) + 
    Dense_rank() over (partition by class_no order by student_id desc) - 1 Students
    from #T_Test
)
select class_no, subject_name,  
  Count(*) Total_Subjects, 
  Max(students) Total_Students
from s
group by class_no, subject_name

推荐阅读