student_course NAME                           COURSE                               MARK
 '张三 '                      ‘Java’                               100 
 '张三 '                      ‘Jdbc’                               100  
 '张三 '                      ‘Hibernate’                          20  
 '李四 '                      ‘Java’                               80 
 '李四 '                      ‘Jdbc’                               80  
 '李四 '                      ‘Hibernate’                          80   
 '王五 '                      ‘Java’                               60 
 '王五 '                      ‘Jdbc’                               60  
 '王五 '                      ‘Hibernate’                          60                      
  1.按要求写一条SQL语句显示效果为     
  NAME            JAVA             JDBC           HIBERNATE          
‘张三’           100             100             20
‘李四’           80              80              80
‘王五’           60              60              60答案  select name, 
      sum(decode(t.course, 'java', t.)) "java", 
      sum(decode(t.course, 'jdbc', t.)) "jdbc", 
      sum(decode(t.course, 'hibernate', t.)) "hibernate" 
      from student_course t 
      group by t.name; 
   是正确的,但是为什么要加入SUM这个组函数呢?我试过,将SUM改成其他的组函数貌似也可以,如果不分组会出现9条数据
这又是什么原因呢?真的不是很明白组函数啊!!这个SQL语句的执行顺序是怎么样的也不太清楚,麻烦拿位高手做个详细的解释了,谢谢啊!!

解决方案 »

  1.   

    decode(t.course, 'java', t.) 改成 decode(t.course, 'java', t.,0) decode(t.course, 'jdbc', t.) 改成 decode(t.course, 'jdbc', t.,0) decode(t.course, 'hibernate', t.) 改成 decode(t.course, 'hibernate', t.,0) 再试试。
      

  2.   

    student_course NAME                          COURSE                              MARK 
    '张三 '                      ‘Java’                              100 
    '张三 '                      ‘Jdbc’                              100  
    '张三 '                      ‘Hibernate’                          20  
    '李四 '                      ‘Java’                              80 
    '李四 '                      ‘Jdbc’                              80  
    '李四 '                      ‘Hibernate’                          80  
    '王五 '                      ‘Java’                              60 
    '王五 '                      ‘Jdbc’                              60  
    '王五 '                      ‘Hibernate’                          60                      
    select name, 
          decode(t.course, 'java', t.,0) "java", 
          decode(t.course, 'jdbc', t.,0) "jdbc", 
          decode(t.course, 'hibernate', t.,0) "hibernate" 
          from student_course t 
          ; 
    你不用分组求和出来的结果是这样的
    NAME                         JAVA                             jdbc           hibernate
    '张三 '                       100                              0               0
    '张三 '                       0                               100              0
    '张三 '                       0                               0                20  
    '李四 '                       80                              0                 0
    '李四 '                      0                                80                0 
    '李四 '                      0                                0                  80  
    '王五 '                        60                              0                 0
    '王五 '                      0                                60                0
    '王五 '                      0                                0                60   
      

  3.   


    因为 t.course 与空值的和为t.course ,最大值也是t,course
    若不想出现重复行就必须使用分组,使用分组就必须用到聚合函数不使用的话这种方法也可以
    select name,a. java,b. jdbc,c. hibernate from (select * from test_a where course='java') a inner join (select * from 
    test_a where course='jdbc') b using(name) inner join (select * from test_a where course='hibernate') c using (name) order by a. desc;
      

  4.   

    因为要完成要求,且不出现重复,你要将原表按姓名进行分组
    按name分组,所以name可以在select后使用,其他字段就必须用聚合函数提取
    decode函数里,达到条件的返回course,否则返回null
    你只要将course和null合并成一个符合条件的值就行,不一定要用sum函数
    执行顺序是select-group by-decode-sum
    系统先读出这个一个分组查询语句,检查字段,执行decode返回结果
      

  5.   


    了解一下decode的用法
    decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
      

  6.   

    很简单,因为每一个名称都要求存在一条记录,所以用了group by ,那聚合函数sum max 等你随便用
      

  7.   


    最好还是用有默认值的。decode(t.course, 'java', t.) 改成 decode(t.course, 'java', t.,0) 
      

  8.   

    楼主,能不能把你建表的sql语句贴出来,学习一下
      

  9.   

    按照你的要求,首先肯定是需要使用分组的,那么就需要使用聚合函数,
    就如你所说,不一定需要使用sum,其实max,min等函数都是可以的
    只要将course和null结合为适当的值就可以了。
      

  10.   

    create table t1(
      name varchar2(10),
      course varchar2(10),
       number
    );insert into t1(name,course,)
      select '张三','java',100 from dual union all
      select '张三','jdbc',90 from dual union all
      select '张三','Hibernate',80 from dual union all
      select '李四','java',100 from dual union all
      select '李四','jdbc',78 from dual union all
      select '李四','Hibernate',88 from dual union all
      select '王五','java',100 from dual union all
      select '王五','jdbc',86 from dual union all
      select '王五','Hibernate',87 from dual;      select 
              t.name,
              decode(t.course,'java',t.) java, 
              decode(t.course,'jdbc',t.) jdbc,
              decode(t.course,'Hibernate',t.) hibernate
            from t1 t;
            
            
           select 
              t.name,
              min(decode(t.course,'java',t.)) java, 
              min(decode(t.course,'jdbc',t.)) jdbc,
              min(decode(t.course,'Hibernate',t.)) hibernate
            from t1 t
            group by t.name
            ;
            
            
              select 
              t.name,
              max(decode(t.course,'java',t.)) java, 
              max(decode(t.course,'jdbc',t.)) jdbc,
              max(decode(t.course,'Hibernate',t.)) hibernate
            from t1 t
            group by t.name
            ;
            
            
            select 
              t.name,
              sum(decode(t.course,'java',t.)) java, 
              sum(decode(t.course,'jdbc',t.)) jdbc,
              sum(decode(t.course,'Hibernate',t.)) hibernate
            from t1 t
            group by t.name
            ;
            
            
            select 
              t.name,
              avg(decode(t.course,'java',t.,0)) java, 
              avg(decode(t.course,'jdbc',t.,0)) jdbc,
              avg(decode(t.course,'Hibernate',t.,0)) hibernate
            from t1 t
            group by t.name
            ;
      

  11.   

    因为要按姓名分组,所以用到group by;因为group by 的语法限制,所以要用sum,或者max