我有张表 字段是姓名和5门课程姓名     语文   数学    英语    物理    化学
张三      优      良         优       中       差
李四      优      优         优       优       良
王五      良      良         良       良       优
现在我有两个需求1.要选出至少三门或三门以上课程成绩一样的记录,比如 语数外都是优 或者语外物理化学都是良这样的记录
                           2.还是至少三门或三门以上课程成绩一样的记录,但语数这两门课都要在里面

解决方案 »

  1.   

    Oracle 可以考虑用unpivot函数,把列转成行,然后再判断就方便多了另外说一句,这个表设计得不好,如果再多一部门课程就得改表结构
      

  2.   

    where 条件一个一个的罗列吧
    where 
    (语文=数学 and 语文=英语)
    OR
    (语文=数学 and 语文=物理)
    OR
    (语文=数学 and 语文=化学)
    OR
    (语文=英语 and 语文=物理)
    OR
    (语文=英语 and 语文=化学)
    OR
    (语文=物理 and 语文=化学)
    or
    (数学 =英语 and 数学 =物理)
    or
    (数学 =英语 and 数学 =化学)
    or
    (数学 =物理 and 数学 =化学)
    or
    (英语 =物理and 英语 =化学)
      

  3.   

    select 姓名, val, count(1)
      from tab unpivot(val for item in(语文 ,  数学 ,   英语 ,   物理 ,   化学))
     group by 姓名, val
    having count(1) >= 3;select 姓名, val, count(1), sum(decode(item, '语文', 1, '数学', 1, 0))
      from tab unpivot(val for item in(语文 ,  数学 ,   英语 ,   物理 ,   化学))
     group by nn, val
    having sum(decode(item, '语文', 1, '数学', 1, 0)) = 2 
       and count(1) >= 3
    ;