我有一个表, 表名AAA,这个表没有主键的
其中有两个column , AE_ID 和 ACC_NUM,这两组column中的数据都是有重复的.
我想在这两个column 中找出 同一个ACC_NUM 中有两个不同的AE_ID  , 然后用 'Y' 表示.
如果一个ACC_NUM 中相对应只有一个AE_ID , 则用'N' 表示.
最后显示  AE_ID,ACC_NUM,'Y' or 'N' 的内容. 
我想了很久没想出来, 请大虾们帮忙想一下.

解决方案 »

  1.   

    select acc_num,decode(num,1,'N','Y') num
    from (
    select acc_num,count(*) num
    from aaa
    group by acc_num)
      

  2.   

    select a.AE_ID,a.acc_num,decode(b.num,1,'N','Y') num
    from AAA a ,(
    select acc_num,count(*) num
    from AAA
    group by acc_num) b
    where a.acc_num=b.acc_num
      

  3.   

    -- 给你个例子:  TRY IT ..
    SQL> SELECT * FROM TEST_NUM;      NUM1       NUM2        QTY
    ---------- ---------- ----------
             1          1          1
             1          2          1
             1          3          1
             2          4          1
             2          5          1
             2          6          1
             3          7          1
             3          8          1
             4          9          1
             4         10          1
             5          1          211 rows selectedSQL> SELECT NUM1,
      2         (CASE WHEN COUNT(NUM2) > 1
      3              THEN 'Y'
      4              ELSE 'N'
      5          END) "DIFFS"
      6    FROM TEST_NUM
      7   GROUP BY NUM1;      NUM1 DIFFS
    ---------- -----
             1 Y
             2 Y
             3 Y
             4 Y
             5 N-- 按照你的需求:
    SELECT ACC_NUM,
           (CASE WHEN COUNT(AE_ID) > 1
                THEN 'Y'
                ELSE 'N'
            END) "DIFFS"
      FROM AAA
     GROUP BY ACC_NUM;-- 或者用分析函数:
    SELECT ACC_NUM,
           AE_ID,
           (CASE WHEN COUNT(AE_ID) OVER(PARTITION BY ACC_NUM) > 1
                THEN 'Y'
                ELSE 'N'
            END) "DIFFS"
      FROM AAA;
      

  4.   

    select ACC_NUM,decode(sign(lCount-1),1,'Y','N') from(
    select ACC_NUM,count(distinct AE_ID) lCount from AAA group by ACC_NUM)
      

  5.   


    create table  t
    (
    AE_ID int, ACC_NUM int
    )
    select * from t
          ae_id    acc_num
    1 1 1
    2 1 2
    3 1 2
    4 2 4
    5 2 5
    6 3 6--去掉重复,如果有重复数据 在子查询中增加distinct 
    --SQL
    select ae_id,max(acc_num) acc_num,case when max(nn)>1 then 'Y' else 'N' end mm
    from 
    (select ae_id,acc_num,row_number() over(partition by ae_id order by ae_id) nn from t )
    group by ae_id--result:
    1 1 2 Y
    2 2 5 Y
    3 3 6 N
    看数据是否你想要的!
    建议日后这种问题最好有实例,这样子更快解决!
      

  6.   

    hebo2005  ,不好意思, 我刚才没有提问得清楚.
    我想要的最终结果是 ae_id , 'Y' 或 'N'.
    最终显示的对像是AE_ID 是 'Y' 还是 'N'
    如果一个ae_id 中有一个acc_num 是 'Y' 的,那么这个AE_ID
    的结果就是 'Y' , ACC_NUM 是不用显示出来的,它只是一个过渡条件.
      

  7.   

    SQL> select * from aaa;   ACC_NUM      AE_ID
    ---------- ----------
             1        234
             2        456
             3        454
             1        235
             2        234SQL> 
    SQL> select aaa.acc_num ,aaa.ae_id,t.num from (select acc_num,decode(num,1,'N',2,'Y') num
      2  from (
      3  select acc_num,count(*) num
      4  from aaa
      5  group by acc_num)) t,aaa where aaa.acc_num=t.acc_num
      6  ;   ACC_NUM      AE_ID NUM
    ---------- ---------- ---
             1        234 Y
             2        456 Y
             3        454 N
             1        235 Y
             2        234 Y
      

  8.   

    SQL> select * from aaa;   ACC_NUM      AE_ID
    ---------- ----------
             1        234
             2        456
             3        454
             1        235
             2        234SQL> 
    SQL> select aaa.acc_num ,t.num ae_id from (select acc_num,decode(num,1,'N',2,'Y') num
      2  from (
      3  select acc_num,count(*) num
      4  from aaa
      5  group by acc_num)) t,aaa where aaa.acc_num=t.acc_num
      6  ;   ACC_NUM AE_ID
    ---------- -----
             1 Y
             2 Y
             3 N
             1 Y
             2 Y
      

  9.   

    例如我的表如下:( 每个都可能重复很多次, 可能不止一两次的.)
    ACC_NUM        AE_ID
    --------    ----------
    22             A
    33             A
    22             B
    11             C
    55             D
    44             E
    22             F
    33             E我想要的结果如下:  (当作 ae_id distinct 过) 
    AE_ID     Flag
    -----  ----------
    A          Y         (因为有一个ACC_NUM 同时有两个AE_ID ,所以为Y, 如 22)
    B          Y         (因为有一个ACC_NUM 同时有两个AE_ID ,所以为Y, 如 22)
    C          N         (11这个ACC_NUM没有其他的AE_ID共享了,所以为N.)
    D          N         (55这个ACC_NUM没有其他的AE_ID共享了,所以为N.)
    E          Y         (44这个ACC_NUM虽然没被共享, 但E这个ACC_NUM 下还有一个33的ACC_NUM被A,E共享了,所以为Y.)
    F          Y         (22被B和F共享了)
    这就是我的完整需求了, 还请大家不吝指教.
      

  10.   

    楼上, 好像有点偏差啊, 我最后是要显示AE_ID的, 
    如果将你的例子,把ACC_NUM与AE_ID对换一下, 
    也是得不到我想要的结果的.
      

  11.   


    select ae_id,case when max(nn)<>max(mm) 
    or (max(nn)>1 or max(mm)>1)  then 'Y' else 'N' end aa
    from 
    (
    select distinct ae_id,
    row_number() over(partition by ae_id order by ae_id) nn,
    row_number() over(partition by acc_num order by ae_id) mm
    from t 
    )
    group by ae_id--RESULT:
    1 A Y
    2 B Y
    3 C N
    4 D N
    5 E Y
    6 F Y
      

  12.   

    -- TRY IT ..
    SQL> SELECT DISTINCT
      2         AE_ID,
      3         (CASE WHEN COUNT(ACC_NUM) OVER(PARTITION BY AE_ID) > 1 OR COUNT(AE_ID) OVER(PARTITION BY ACC_NUM) > 1
      4               THEN 'Y'
      5               ELSE 'N'
      6           END) "FLAG"
      7    FROM TABLE_NAME TT
      8  ;AE_ID FLAG
    ----- ----
    A     Y
    B     Y
    C     N
    D     N
    E     Y
    F     Y6 rows selected
      

  13.   


    SELECT DISTINCT a4.ae_id, CASE
              WHEN a3.ae_id = a4.ae_id
                 THEN 'Y'
              ELSE 'N'
           END AS DD
      FROM (SELECT  a1.AE_ID ae_id
                       FROM trade_client_vw a1, trade_client_vw a2
                      WHERE a1.ACC_NUM = a2.ACC_NUM AND a1.AE_ID <> a2.AE_ID) a3,
           trade_client_vw a4
     WHERE a3.ae_id(+) = a4.ae_id
    在同事的帮助下终于用一个比较简单的办法解决了, 贴上来, 大家互相学习一下.