【问题标题】:Sql sum() function based on input table values基于输入表值的sql sum() 函数
【发布时间】:2015-08-19 21:56:07
【问题描述】:

我正在尝试将 sql 查询写入学生成绩表下方,我们需要从中计算每个学生成绩的总成绩。

以下是获得所需输出的规则/条件:

  1. 如果学生成绩为“A”,则不考虑“B”成绩。 并进行聚合。不要在输出表中填充 B 级。

  2. 如果给定表中没有“A”级学生,则检查“B”级学生并进行汇总。

我尝试了一些方法,但没有得到想要的输出。但是我仍然对选择正确的方法来获得所需的输出感到困惑。

例如:这是我的表和所需的查询。

select exam,
   sum(CASE WHEN students_grade in ("A") THEN marks
       ELSE 
       students_grade in ("B") THEN marks END) aggregate
from input_table 
group by exam

输入表:

student_grade     Exam       Marks 
------------------------------------------------------
A                 test_1        10.00
B                 test_1        10.00
A                 test_1        10.00
A                 test_1        20.00
A                 test_1        20.00
B                 test_1        30.50

期望的输出:

student_grade     Exam       aggregate 
---------------------------------------------------------
A                 test_1        60.00

请更正上述查询以获得所需的输出/应用上述条件,提前致谢

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:
    select i.students_grade, i.exam, sum(i.marks) as aggregate
    from input_table i
    inner join
    (select exam, min(students_grade) as mng
    from input_table
    group by exam) t
    on t.exam = i.exam and t.mng = i.students_grade
    group by i.students_grade, i.exam
    

    假设您在每次考试中寻找最好的成绩(由min 排序),上述查询应该可以工作。

    【讨论】:

    • 我认为您的意思是内部连接。左连接会稍微搞砸输出。
    【解决方案2】:
    SELECT student_grade, exam, sum(marks) AS aggregate
    FROM input_table
    GROUP BY student_grade, exam
    

    【讨论】:

      【解决方案3】:
      select student_grade, Exam, Sum(Marks) aggregate from Table_1 where
         student_grade = isNull((select distinct student_grade from Table_1 where
             student_grade = 'A'), (select distinct student_grade from Table_1 where
                student_grade = 'B'))
      group by student_grade, Exam
      

      【讨论】:

        【解决方案4】:
        select
            left(MixCode, 1) as student_grade,
            exam,
            sum(
                case
                    when MixCode in ('AA', 'BB') then marks
                    when MixCode = 'AB' and student_grade = 'A' then marks
                end
            ) as aggregate
        from
            input as i inner join
            (
                select exam, min(student_grade) + max(student_grade) as MixCode
                from input
                group by exam
            ) as m
                on m.exam = i.exam
        group by exam
        

        如果您有其他成绩组合需要考虑,上述查询可能效果最佳。我认为下面的查询也可以。这里的想法实际上是说您只想要每门考试的最高分数而忽略所有其他分数:

        select min(student_grade) as student_grade, exam, sum(marks)
        from input as i
        where student_grade = (select min(student_grade) from input as i2 where i2.exam = i.exam)
        group by exam
        

        *记住min()意味着更高的等级。

        【讨论】:

          【解决方案5】:
          select (case when Amarks>0 then Amarks else Bmarks end)  as aggregate,exam
          from(
             SELECT sum( case when student_grade='A' then marks else 0 end )as Amarks
             , sum( case when student_grade='B' then marks else 0 end )as Bmarks
             ,exam
          FROM input_table
          GROUP BY  exam
          ) a
          

          【讨论】:

            猜你喜欢
            • 2020-04-21
            • 2017-07-30
            • 2018-06-18
            • 2021-10-07
            • 1970-01-01
            • 2016-10-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多