首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COUNT和GROUP的不同用法

COUNT和GROUP的不同用法
EN

Stack Overflow用户
提问于 2014-12-22 23:37:37
回答 4查看 74关注 0票数 0

与我之前发布的另一个问题非常相似,但更复杂(我认为!)

我有一组表:

表1

代码语言:javascript
复制
 StudentId   Student     Course
 1234567     J. Bloggs   ABC      
 1234567     J. Bloggs   ABC       
 2345678     T. Test     ABC       

表2

代码语言:javascript
复制
StudentId    Student       Module      Result      StartDate     EndDate
1234567      J. Bloggs     DEF         Fail        13/01/2014    13/03/2014
1234567      J. Bloggs     DEF         Pass        01/05/2014    15/07/2014
2345678      T. Test       DEF         Pass        13/01/2014    13/03/2014

我想要做的是让SQL返回,首先是学生在模块中尝试了多少次,然后返回最近的EndDate和结果,就像这样。

代码语言:javascript
复制
Student     Course    Module      ModuleAttempts       Result       EndDate
J. Bloggs   ABC       ABC               2              Pass         15/07/2014
T. Test     ABC       ABC               1              Pass         13/03/2014

编辑:添加初始表布局

EN

回答 4

Stack Overflow用户

发布于 2014-12-22 23:42:38

这应该可以做到:

代码语言:javascript
复制
;WITH CTE AS
(
    SELECT  *,
            ModuleAttempts = COUNT(*) OVER(PARTITION BY Student, Module),
            RN = ROW_NUMBER() OVER(PARTITION BY Student, Module
                                   ORDER BY EndDate DESC)
    FROM dbo.YourTable
)
SELECT  Student,
        Course,
        Module,
        ModuleAttempts,
        Result,
        EndDate
FROM CTE
WHERE RN = 1;
票数 3
EN

Stack Overflow用户

发布于 2014-12-23 00:05:04

这就对了:SQL Fiddle Demo

代码语言:javascript
复制
SELECT Student, Course, Module, 
(SELECT COUNT(*) FROM myTable t2 WHERE t2.Student = t1.Student) as ModuleAttempts, 
CASE WHEN CAST(MAX(CAST(RESULT as INT)) AS BIT) = 1 THEN 'PASS' ELSE 'Fail' END as Result,
MAX(EndDate) as EndDate
FROM MyTable t1
GROUP By Student, Course, Module

备注:

在我的示例中,SELECT COUNT结果是一个位列(Pass = 1,Failed =0)语句:(SELECT COUNT(*)

  • myTable t2 WHERE t2.Student = t1.Student)应为t2.ID = t1.ID,而不是t2.Student =t1.Student。
票数 0
EN

Stack Overflow用户

发布于 2014-12-23 00:14:16

Lamak的答案是正确的,但由于结果只包含fail和pass,下面的查询也可以。

代码语言:javascript
复制
    SELECT  Student,
            Course,
            Module,
           count(ModuleAttempts) as ModuleAttempts,
           max(Result) as Result,
--max(Result) will return "pass" (if pass exists) as it comes after fail in dictionary 
           max(EndDate) as EndDate
    from table
    group by Student,
            Course,
            Module
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27605758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档