【问题标题】:SQL to COUNT items associated with individualsSQL to COUNT 与个人相关的项目
【发布时间】:2015-01-22 08:56:33
【问题描述】:

我有一个包含学生数据的表(ClassEnrolments):

StudentId       Student        Module          Status      EndDate         Credits
12345678        J Bloggs       Introduction    Pass        2014/09/01      10
12345678        J Bloggs       Advanced        Pass        2014/06/01      15
23456789        T Guy          Introduction    Pass        2013/05/25      10
23456789        T Guy          Advanced        Pass        2014/03/21      15

我想要做的是返回有关学生在设定的时间段内总共学习了多少模块的信息,例如,如果我们获取上述数据并查看 2014 年 1 月 1 日至 24 日期间/11/2014 它将返回以下内容(基于 EndDate)

StudentId        Student        Modules      Credits      AnnivDate
12345678         J Bloggs       2            25           2015/06/01
23456789         T Guy          1            15           2014/05/25

这是使用 SQL Server 2008 - 任何帮助将不胜感激。

我现在也想知道是否使用相同的场景 - 是否可以计算从那些学习的模块中获得的学分数量?

另一个想法!根据学生最重要的模块查看某种周年日期会很有用。这将有助于确定学生是否在周年纪念日之前获得了正确的学分。我玩过 DATEADD 函数的想法,但这似乎又重复了学生信息。

DATEADD(MONTH, DATEDIFF(MONTH, 0, EndDate()) +12,0) AS AnnivDate

我明白为什么,因为会有多个实例,但是有没有办法查看 EndDate 的第一个实例?

【问题讨论】:

  • 我想问一下你的任务的目的,我的意思是你得到了模块的数量,而不是一个学生完成的模块的名称。我只是在猜测你是否只想这样?跨度>
  • 没错,是的。不一定对模组名称感兴趣,只是在特定时期内拍摄了多少。
  • 感谢大家的建议,一切似乎都很好!
  • @SB1987 - 我没有得到周年纪念日逻辑如何找到学生最重要的模块
  • 基本上假设一个学生从他们从相关时间段开始学习第一个模块开始有 12 个月的时间(WHERE EndDate BETWEEN '2014-01-01' AND '2014-11-24') .我需要代码来查看模块的日期,确定首先研究哪个,然后添加 12 个月并将其返回到 AnnivDate 列中

标签: sql sql-server sql-server-2008 aggregate-functions


【解决方案1】:

试试这个:

Set dateformat DMY;
Select StudentId, Student, Count(Modules) as ModuleCount
from ClassEnrolments 
Where EndDate >= convert(Datetime, '01-01-2014', 105) and 
EndDate <= convert(Datetime, '24-11-2014', 105)
Group By StudentId, Student

【讨论】:

    【解决方案2】:

    使用Group By 和聚合函数count 统计Module 并通过使用Between operator 过滤特定日期范围之间的数据来过滤数据

    SELECT StudentId,
           Student,
           Count(Module) Module,
           Sum(Credits) Credits
    FROM   tablename
    WHERE  EndDate BETWEEN '2014-01-01' AND '2014-11-24'
    GROUP  BY StudentId,
              Student 
    

    【讨论】:

    • 这很完美,完全符合我的要求 - 谢谢!
    • @SB1987 很高兴它帮助了你
    • 我已经添加了关于学分的信息 - 您知道如何将其添加到查询中吗?
    • @SB1987 没问题就加sum(Credits)查看答案更新
    • 添加了另一个查询,如果您能提供任何建议,将不胜感激!
    【解决方案3】:

    试试这个:

    SELECT
       StudentId,
       Student,
       COUNT(*) Modules
    FROM ClassEnrolments
    WHERE 
       EndDate BETWEEN '2014-01-01' AND '2014-11-24'
    GROUP BY 
       StudentId,
       Student
    

    【讨论】:

      【解决方案4】:
      SELECT StudentID, Student, Count(module) AS Modules
      FROM ClassEnrolments
      GROUP BY StudentID, Student
      

      有日期

      SELECT StudentID, Student, Count(module) AS Modules
      FROM ClassEnrolments
      WHERE EndDate BETWEEN '2014-01-01' AND '2014-11-24'
      GROUP BY StudentID, Student
      

      【讨论】:

        【解决方案5】:
        SELECT
           StudentId,Student,COUNT(*)
        FROM TableName
        WHERE EndDate BETWEEN '2014-01-01' AND '2014-11-24'
        AND Status = 'Pass'
        GROUP BY StudentId,Student
        

        【讨论】:

        • 请为您的答案添加一些解释。仅代码的答案有时就足够了,但代码+解释的答案总是更好
        【解决方案6】:

        实际上不是您要求的,但可能是另一种选择,具体取决于您想要返回的内容。

        DECLARE @ClassEnrollments
        TABLE   (
                StudentId   INT
                ,Student    VARCHAR(50)
                ,Module     VARCHAR(50)
                ,Status     VARCHAR(50)
                ,EndDate    DATE
                )
        
        INSERT
        INTO    @ClassEnrollments
        
        VALUES   (12345678,'J Bloggs','Introduction','Pass','2014/09/01')
                ,(12345678,'J Bloggs','Advanced','Pass','2014/06/01')
                ,(23456789,'T Guy','Introduction','Pass','2013/05/25') -- Excluded
                ,(23456789,'T Guy','Advanced','Pass','2014/03/21')
        
        
        SELECT  StudentId   
                ,Student    
                ,Module     
                ,Status     
                ,EndDate    
                ,COUNT(Module) OVER (PARTITION BY studentId) as #Modules
        FROM    @ClassEnrollments
        WHERE   EndDate 
                BETWEEN '2014-01-01' 
                AND     '2014-11-24'
        ORDER BY
                StudentId
                ,Module
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-06
          • 2012-07-18
          • 2018-04-08
          • 2017-02-16
          • 2017-11-15
          • 2016-11-24
          • 1970-01-01
          相关资源
          最近更新 更多