当前位置: 首页 > 知识库问答 >
问题:

在透视查询中使用if else块

宇文飞翮
2023-03-14

我有一张桌子

StudentID StudentName Subject Marks
      1   Savita      EC1     50
      1   Savita      EC2     55
      1   Savita      EC3     45
      1   Savita      EC4     34
      1   Savita      EC5     23
      2   Rajesh      EC1     34
      2   Rajesh      EC2     56
      2   Rajesh      EC3     12
      2   Rajesh      EC4     45
      2   Rajesh      EC5     23
      3   Smita       EC1     76
      3   Smita       EC2     45
      3   Smita       EC3     67
      3   Smita       EC4     56
      3   Smita       EC5     76
      4   Rahul       EC1     66
      4   Rahul       EC2     34
      4   Rahul       EC3     22
      4   Rahul       EC4     18
      4   Rahul       EC5     33

我写了一个查询,如

SELECT StudentName, EC1,EC2,EC3,EC4,EC5,TotalMarks, case  
  when EC1<30 and ec2<30 then 'fail'
  when EC1<30 and EC3<30 then 'fail'
  when EC1<30 and EC4<30 then 'fail'
  when EC1<30 and EC5<30 then 'fail'
  when EC2<30 and EC3<30 then 'fail'
  when EC2<30 and EC4<30 then 'fail'
  when EC2<30 and EC5<30 then 'fail'
  when EC3<30 and EC4<30 then 'fail'
  when EC3<30 and EC5<30 then 'fail'
  when EC4<30 and EC5<30 then 'fail'
  else 'pass'
  end as Result
FROM (SELECT StudentName, EC1, EC2, EC3, EC4, EC5, TotalMarks=EC1+EC2+EC3+EC4+EC5
      FROM Student
      PIVOT(sum(Marks) for subject in([EC1],[EC2],[EC3],[EC4],[EC5],[TotalMarks]))as pivotTable) A

这将在2个科目中得分低于30分的学生的输出为不及格或及格

Rahul   66  34  22  18  33  173 fail
Rajesh  34  56  12  45  23  170 fail
Savita  50  55  45  34  23  207 pass
Smita   76  45  67  56  76  320 pass

我想给每门少于30分的科目加7分,然后在加7分后看到那些及格不及格的学生。例如添加7个标记后,rajesh记录应该是这样的

Rajesh 34 56 19 45 30 170通过

共有3个答案

夹谷和韵
2023-03-14

你可以试试这个

SELECT 
    StudentName,
    CASE WHEN EC1 < 30 THEN EC1 + 7 ELSE EC1 END AS EC1,
    CASE WHEN EC2 < 30 THEN EC2 + 7 ELSE EC2 END AS EC2,
    CASE WHEN EC3 < 30 THEN EC3 + 7 ELSE EC3 END AS EC3,
    CASE WHEN EC4 < 30 THEN EC4 + 7 ELSE EC4 END AS EC4,
    CASE WHEN EC5 < 30 THEN EC5 + 7 ELSE EC5 END AS EC5,
    Total = (EC1 + EC2 + EC3 + EC4 + EC5),
    CASE  
       WHEN EC1 < 23 AND EC2 < 23 THEN 'FAIL'
       WHEN EC1 < 23 AND EC3 < 23 THEN 'FAIL'
       WHEN EC1 < 23 AND EC4 < 23 THEN 'FAIL'
       WHEN EC1 < 23 AND EC5 < 23 THEN 'FAIL'
       WHEN EC2 < 23 AND EC3 < 23 THEN 'FAIL'
       WHEN EC2 < 23 AND EC4 < 23 THEN 'FAIL'
       WHEN EC2 < 23 AND EC5 < 23 THEN 'FAIL'
       WHEN EC3 < 23 AND EC4 < 23 THEN 'FAIL'
       WHEN EC3 < 23 AND EC5 < 23 THEN 'FAIL'
       WHEN EC4 < 23 AND EC5 < 23 THEN 'FAIL'
       ELSE 'PASS'
   END AS Result
FROM
(
   SELECT * FROM Student
) AS ST
PIVOT
(
    SUM(Marks) For [Subject] IN (EC1, EC2, EC3, EC4, EC5)
) AS PV

输出

Rahul   66  34  29  25  33  173 FAIL
Rajesh  34  56  19  45  30  170 PASS
Savita  50  55  45  34  30  207 PASS
Smita   76  45  67  56  76  320 PASS
阎晗日
2023-03-14

您可以使用窗口版本的SUMCOUNT聚合函数来简化查询:

SELECT StudentID, StudentName, 
       [EC1],[EC2],[EC3],[EC4],[EC5], 
       Total,
       CASE WHEN Below30 >= 2 THEN 'Fail'
            ELSE 'Pass'
       END AS WithoutBonus, 
       CASE WHEN Below23 >= 2 THEN 'Fail'
            ELSE 'Pass'
       END AS WithBonus
FROM (SELECT StudentID, StudentName, Subject, Marks,
             SUM(Marks) OVER (PARTITION BY StudentID) AS Total,
             COUNT(CASE WHEN Marks < 30 THEN 1 END) 
                OVER (PARTITION BY StudentID) AS Below30, 
             COUNT(CASE WHEN Marks < 23 THEN 1 END) 
                OVER (PARTITION BY StudentID) AS Below23 
      FROM mytable ) AS src
PIVOT (
   MAX (Marks)
   FOR Subject IN ([EC1],[EC2],[EC3],[EC4],[EC5]) ) pvt
ORDER BY StudentName

低于30计算具有标记的受试者数量

因此,如果一个特定的学生有2门或更多科目的分数为,则WithoutBonus“不及格”

此处演示

如果要输出标记值加7,以防它们是

SELECT StudentID, StudentName, 
       [EC1],[EC2],[EC3],[EC4],[EC5], 
       Total,
       CASE WHEN Below23 >= 2 THEN 'Fail'
            ELSE 'Pass'
       END AS WithBonus
FROM (SELECT StudentID, StudentName, Subject, 
             CASE WHEN Marks < 30 THEN Marks+7 ELSE Marks END AS Marks,
             SUM(Marks) OVER (PARTITION BY StudentID) AS Total,          
             COUNT(CASE WHEN Marks < 23 THEN 1 END) OVER (PARTITION BY StudentID) AS Below23 
      FROM mytable ) AS src
PIVOT (
   MAX (Marks)
   FOR Subject IN ([EC1],[EC2],[EC3],[EC4],[EC5]) ) pvt
ORDER BY StudentName

输出:

StudentID   StudentName EC1 EC2 EC3 EC4 EC5 Total   WithBonus
--------------------------------------------------------------
4           Rahul       66  34  29  25  33  173     Fail
2           Rajesh      34  56  19  45  30  170     Pass
1           Savita      50  55  45  34  30  207     Pass
3           Smita       76  45  67  56  76  320     Pass

陶乐生
2023-03-14

也许这就是你要找的东西:

SELECT A.StudentName, EC1,EC2,EC3,EC4,EC5,Total,
  case when fail2 >= 2 then 'Failure'
       when fail >= 2 then 'Near Pass'
       else 'Pass' end as Result
FROM
(  SELECT StudentName, EC1, EC2, EC3, EC4, EC5
      FROM Student
      PIVOT(sum(Marks) for subject in([EC1],[EC2],[EC3],[EC4],[EC5]))as pt) A,
(  select
      studentName,
      sum(case when Marks <  30 then 1 else 0 end) as fail,
      sum(case when Marks <  23 then 1 else 0 end) as fail2,
      sum(case when Marks >= 30 then 1 else 0 end) as pass,
      sum(marks) as total
  from
      student
  group by
      studentname
) B
where 
    A.StudentName = B.StudentName

我删除了您针对所有失败组合的比较逻辑,并将其替换为原始表中的“按案例分组求和”,这样您就可以确定每个学生的失败、接近通过和通过次数,而不必单独列出所有案例。

您可以在 SQL 小提琴中对此进行测试

 类似资料:
  • 问题内容: 我有桌子 我写了一个查询 给出在两个科目中得分不超过30分的学生的成绩为不及格或不及格 我想为少于30的每个科目添加7分,并在添加7分后查看通过不及格的学生。例如-在添加7个标记之后,rajesh记录应该像 问题答案: 你可以试试这个 输出

  • 问题内容: 我正在寻找一种方法来调整以下结果… 分为以下结构。 列数是固定的(它将始终是部门/部门/类别)。该查询适用于Sybase。。。尚无法弄清楚如何实现这种转换。有什么建议吗? 问题答案: 您需要一些键来定义3行的集合。然后,您就可以自我加入 所以对于这样的数据… 你会

  • 问题内容: 我正在使用MySQL。这是我的桌子 我需要一个选择查询来显示类似这样的表。 问题答案: 您可以使用此查询- 它产生您想要的结果。但是,如果您想动态地进行操作,请参阅这篇文章“自动执行数据透视表查询”-http: //www.artfulsoftware.com/infotree/queries.php#523,或者该链接- 动态数据透视表。

  • 问题内容: 我在表中有数据,如下所示: 我想编写一个SQL查询,以便给出如下结果: 问题答案: Oracle 9i +支持: 您只列出了两列-可能应按年份将类似的内容分组。 有ANSI PIVOT(和UNPIVOT)语法,但是Oracle直到11g才支持它。在9i之前,您必须将CASE语句替换为Oracle特定的DECODE。

  • 问题内容: 以下查询执行得很好… 输出看起来像 但是我的疑问是如何获取列的动态字段值。 那是 , 如何使用以上查询 问题答案: 要使PIVOT动态,您必须编写一个存储过程。 然后,您可以这样称呼它:

  • 在我的Laravel应用程序中,我有三个数据库表,分别称为users、projects和roles。它们之间存在m:n关系,所以我也有一个称为PROJECT_USER_ROLE的透视表。透视表包含user_id、project_id和role_id列。请参见MySQL工作台的屏幕截图。 我的用户、项目和角色模型得到了如下定义的归属关系: 现在我可以很容易地获得通过身份验证的用户的项目: 对此的回应