表table:字段A,B,C,D要求找出不符合如下要求的数据:针对每种A和B的组合的记录,只能有一条记录的C字段不为0,且此记录的D字段必须是同组合中各记录中最大的想破头也想不出这种sql怎么写,高手百忙中帮个忙吧!谢谢啦!

解决方案 »

  1.   

    主查询:
    select A, B, Count(C) from [subquery]
    group by A,B
    having Count(C)=1子查询:(把肯定不符合条件的记录去条)
    select A, B, C, D from table 
    where D>A 
    and D>B
    and D>C
    and C<>0将子查询代入主查询就可以了:
    select A, B, Count(C) from 
        (select A, B, C, D from table 
        where D>A 
        and D>B
        and D>C
        and C<>0)
    group by A,B
    having Count(C)=1
      

  2.   

    我发现数据库版块的有关“SQL语句如何写”的问题都很bt。为什么不能是设计上做些变化呢。如果要发现写这么bt的语句,就得反思一下设计是否合理了。要从根本的解决问题才行。
      

  3.   

    详细情况是这样的表名tablenameName   Type         Nullable Default Comments                                 
    ------ ------------ -------- ------- ---------------------------------------- 
    AAC001 VARCHAR2(10)                  个人编号                                 
    AAE001 NUMBER(4)                     年度                                     
    AAE140 VARCHAR2(3)                   险种类型                                 
    AIC064 VARCHAR2(3)                   个人账户状态                             对每个人参加的每个险种(AAC001-AAE140),由于年度不同会有多条记录,但只能有一条记录的AIC064<>0,且此条记录的年度必须为同人同险种的最大值现在要找出不符合这个要求的所有数据不知道这次我说清楚了没有?
      

  4.   

    比如人员编号11111,参加的险种1此人此险种在2001,2002,2003,2004年度有四条记录如果在2004年的记录的AIC064不为0就是正确的,反之如果在2003年的记录中AIC064不为0就不对找出这样的数据?
      

  5.   

    自顶一下,现在前一个问题已经解决了,但后一个“确保每个AIC064不为0时,该记录的年度必为同人同险种的记录中的年度的最大值”还没有解决,写了个sql但效率太低。select * from ic02 a,(select aac001,aae140 from ic02 group by aac001,aae140) b where (a.aac001=b.aac001 and a.aae140=b.aae140 and a.aic064 <> 0 and a.aae001 < (select max(aae001) from ic02 c where a.aac001=c.aac001 and a.aae140=c.aae140))
      

  6.   

    楼主想获取在人员及险种相同的情况下aic064='1'的.但aae001不是最大的记录.
    创建表
    create table TT
    (
      AAC001 VARCHAR2(6),
      AAE140 VARCHAR2(3),
      AIC064 VARCHAR2(3),
      AAE001 VARCHAR2(4)
    )
    插入数据.
    insert into TT (AAC001, AAE140, AIC064, AAE001)
    values ('11111', '11', '0', '2005');
    insert into TT (AAC001, AAE140, AIC064, AAE001)
    values ('11111', '11', '0', '2004');
    insert into TT (AAC001, AAE140, AIC064, AAE001)
    values ('11111', '11', '0', '2003');
    insert into TT (AAC001, AAE140, AIC064, AAE001)
    values ('11111', '11', '1', '2002');
    insert into TT (AAC001, AAE140, AIC064, AAE001)
    values ('22222', '22', '1', '2006');
    insert into TT (AAC001, AAE140, AIC064, AAE001)
    values ('22222', '22', '0', '2005');
    insert into TT (AAC001, AAE140, AIC064, AAE001)
    values ('11111', '11', '1', '2006');
    insert into TT (AAC001, AAE140, AIC064, AAE001)
    values ('22222', '22', '1', '2004');
    insert into TT (AAC001, AAE140, AIC064, AAE001)
    values ('11111', '22', '1', '2006');
    insert into TT (AAC001, AAE140, AIC064, AAE001)
    values ('11111', '22', '0', '2005');
    insert into TT (AAC001, AAE140, AIC064, AAE001)
    values ('11111', '22', '0', '2004');
    commit;
    查询数据
    AAC001 AAE140 AIC064 AAE001
    ------ ------ ------ ------
    11111  11     1      2002
    11111  11     0      2003
    11111  11     0      2004
    11111  11     0      2005
    11111  11     1      2006
    11111  22     0      2004
    11111  22     0      2005
    11111  22     1      2006
    22222  22     1      2004
    22222  22     0      2005
    22222  22     1      2006执行语句:
    select b.* from 
      (select aic064,aac001 ,aae140, nvl(AAE001,0000) bb  
          from tt where 
           tt.aic064='1'  )
            b,
     (select * from tt a 
     where  a.aae001=(select max(tt.aae001) from tt 
                        where tt.aac001=a.aac001 
                        and tt.aae140=a.aae140)) 
            c 
     where b.aac001=c.aac001 and b.aae140=c.aae140 and b.bb<c.aae001
    执行结果:::
    AIC064 AAC001 AAE140 BB
    ------ ------ ------ ----
    1      11111  11     2002
    1      22222  22     2004这两条记录不符合条件.