代码之家  ›  专栏  ›  技术社区  ›  SBB

值大于值的SQL计数列

  •  0
  • SBB  · 技术社区  · 6 年前

    我有一个基本的select查询,它查看表中的一些示例数据。我想得到三条信息。

    • 样本总数(总记录)
    • 分数大于或等于85分的有多少人

    ScoreID RecordID    Score   ErrorMarkedToQID    ErrorActionID
    1   2   30  Q00019  1
    2   2   100 Q20039  3
    3   3   30  Q10091  3
    4   3   35  Q00019  5
    6   4   5   Q10091  3
    

    这就是我所尝试的:

    DECLARE @startDate DATE = '2018/09/12', @endDate DATE = '2018/09/24'
    
    SELECT COUNT(s.ScoreID) AS totalSamples,
           COUNT(CASE WHEN s.Score >= 85 THEN 1 ELSE 0 END) AS Pass,
           COUNT(CASE WHEN s.Score < 85 THEN 1 ELSE 0 END) AS Fail
      FROM [SubmissionScores] AS s
      JOIN Submission AS sub
      ON sub.SubmissionID = s.RecordID
      WHERE sub.DateSubmittedUTC BETWEEN @startDate AND @endDate
    

    我当前的输出是所有字段都输出5,这是记录的总数。所以它看起来像我的 CASE 逻辑不正确。

    这可以在一个简单的查询中完成吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   user937424    6 年前
    DECLARE @startDate DATE = '2018/09/12', @endDate DATE = '2018/09/24'
    
    SELECT COUNT(s.ScoreID) AS totalSamples,
           COUNT(CASE WHEN s.Score >= 85 THEN 1 ELSE NULL END) AS Pass,
           COUNT(CASE WHEN s.Score < 85 THEN 1 ELSE NULL END) AS Fail
      FROM [SubmissionScores] AS s
      JOIN Submission AS sub
      ON sub.SubmissionID = s.RecordID
      WHERE sub.DateSubmittedUTC BETWEEN @startDate AND @endDate
    
        2
  •  0
  •   Pigasus    6 年前

    Count()函数将返回与指定条件匹配的行数,但是Case()的结果是“匹配”和“不匹配”,因此它在所有大小写中返回相同的(总计)行数 对于Case()0或1,您可以使用sum()来汇总Case的结果

     DECLARE @startDate DATE = '2018/09/12', @endDate DATE = '2018/09/24'
    
    SELECT COUNT(s.ScoreID) AS totalSamples,
           SUM(CASE WHEN s.Score >= 85 THEN 1 ELSE 0 END) AS Pass,
           SUM(CASE WHEN s.Score < 85 THEN 1 ELSE 0 END) AS Fail
      FROM [SubmissionScores] AS s
      JOIN Submission AS sub
      ON sub.SubmissionID = s.RecordID
      WHERE sub.DateSubmittedUTC BETWEEN @startDate AND @endDate