2014-04-23 48 views
2

我试图完成一个SQL查询来显示一个学生多少GCSE课程有记录。]SQL计数。当其他两列匹配时,如何计算表中有多少个不同的值?

*STUDENT   *SUBJECT          *SCHOOL 
    ABB13778 | English         | Social Care & Early Years 
    ABB13778 | Information and Communication Technology | Social Care & Early Years 
    ABB13778 | Mathematics        | Social Care & Early Years 
    ABB13778 | Media Studies        | Social Care & Early Years 

例如这个学生应该收到的4计数,因为是分配给学校的4个不同主题和学生卡。

我可以指望的项目,但输出应该是由学校和编号(见下文),我不知道玩具是如何形成的创建这个

       NUM OF STUDENT with each amount of GCSE 
    SCHOOL      1 2 3 4 5 6 7 8 9 10 11 

    Social Care & Early Years | 5 1 2 7 0 1 13 15 8 4  2 
    Built Environment   | 
    Business & Computing  | 

的情况下,这可能是简单的比我思考,但在那一刻我不能让我的头靠近它。任何帮助将不胜感激。

+0

有你看了这个问题? http://stackoverflow.com/questions/2192330/select-countdistinct-value-returns-1?rq=1 –

+0

所以你需要为每个学生计数,然后你想知道有多少学生有一个给定的计数(1到...)为每所学校?你想在一个SQL查询中使用这个吗? –

+0

是的。它可以在几个查询中,但是它来自一个大型数据库,它需要在查询中进行格式化,因为这将是一项繁重的任务。我可以很容易地将数据提取出来,但它并不以我需要的格式@RayHenry –

回答

3

分组由学校和学生的数据后,需要再通过PIVOT对学生有科目每个数字的计数运行,以得到直方图 '垃圾箱':

SELECT [School], [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11] 
FROM 
(
    SELECT School, Student, COUNT([Subject]) AS Subjects 
    FROM Student_GCSE 
    GROUP BY School, Student 
) x 
PIVOT 
(
    COUNT(Student) 
    FOR Subjects IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]) 
) y; 

SqlFiddle here

我假设的对象数量有限,但可以派生列使用dynamic sql

+0

+1:尽管(根据数据的重要性)确实假设没有人拥有12个或更多的GCSE。 – MatBailie

+0

是的,动态地做这件事很简单 - 添加一个链接。 – StuartLC

+1

取决于你对'直截了当'的定义;)就个人而言,我总是不寒而栗,太杂乱,并且推送到应用程序。 – MatBailie

1

Group by应该解决这个问题,像以下:

select SCHOOL, subject, count(*) as NUM_STUDENTS from records 
group by STUDENT, SCHOOL; 
+0

这会提取正确的数据,但不是我需要显示的格式。 –

1

以及现在,我不使用SQL Server和我没有一个SQL命令行方便,但你尝试过这样的事情:

SELECT SCHOOL, N, COUNT(STUDENT) 
FROM (SELECT SCHOOL, STUDENT, COUNT(DISTINCT SUBJECT) AS N 
FROM MY_TABLE GROUP BY SCHOOL, STUDENT) GROUP BY SCHOOL, N; 
+0

+1:虽然这不会像OP所要求的那样支持数据,但它的规范化结构确实意味着它*处理拥有11个以上GCSE的学生。 pivoting比sql层更适合应用程序的表示层。 – MatBailie

相关问题