当前位置: 首页 > 面试题库 >

在数据透视查询中使用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

给出在两个科目中得分不超过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 pass


问题答案:

你可以试试这个

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


 类似资料:
  • 我有一张桌子 我写了一个查询,如 这将在2个科目中得分低于30分的学生的输出为不及格或及格 我想给每门少于30分的科目加7分,然后在加7分后看到那些及格不及格的学生。例如添加7个标记后,rajesh记录应该是这样的

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

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

  • 问题内容: 我想显示给定下表的数据透视表(交叉表)。 桌子: 插入: 现在,我想显示上述数据的数据透视表,如下所示: 预期结果 : 说明 :我想显示的每个员工都有,这是目前所有员工,节目中有多少组的员工可用,必须显示该员工在其他的也GROUP_NAME没有分配给哪些可用最后必须以数据透视格式显示。 问题答案: SELECT * FROM crosstab( $$SELECT grp.*, e.gr

  • 问题内容: 我的MySQL数据库具有以下列标题: 我有兴趣根据typeOfWork和月份显示结果。例如,所有typeOfWork条目将显示在左侧的第一列中,并且每个字段将在每一列的指定月份总计该特定typeOfWork。因此,我的SQL数据透视表语句当前为: 我目前遇到语法错误,指定了最后一行(从’DEC到ROLLUP’)。我感到困惑的原因是,我只是从脚本中的另一个工作枢轴表改编了该表。我认为差异

  • 我正在使用Laravel5.1进行CMS开发。我有一个简单的帖子结构,用户和用户都可以喜欢帖子。 帖子和用户有多对多关系,并使用数据透视表来表示关系。 职位模型有 用户模型有 我想列出用户的最新活动。例如。 Username1喜欢Post2 Username5喜欢Post9 用户名30喜欢Post25 我知道我必须像这样编写sql查询- 上面的查询工作正常,但有没有办法使用laravel雄辩?