如下所示,在test表中:
A B D E
10 tec1 3 100101
10 tec2 3 100101
20 tec2 3 100101
20 tec1 3 100101
30 tec3 3 100101
40 tec4 3 100101
11 tec1 4 100101
11 tec2 4 100101
21 tec1 4 100101
21 tec2 4 100101
31 tec3 4 100101
41 tec4 4 100101想查询出下列的数据,满足下列条件,满足下面的条件:
如果 D、E列相同的话,对A、B列数据做如下处理,
比如 前四条记录:A列的10对应着B列的 tec1,tec2;A列的20也对应着B列的tec1,tec2;那么就任意分配tec1,tec2给A列的10和20。使其成为 10 tec1,20 tec2 或者 10 tec2,20 tec1。最后得到的数据,如下所示:A B D E
10 tec1 3 100101
20 tec2 3 100101
30 tec3 3 100101
40 tec4 3 100101
11 tec1 4 100101
21 tec1 4 100101
31 tec3 4 100101
41 tec4 4 100101还请各位帮帮忙。谢谢啊

解决方案 »

  1.   

    SELECT A,MIN(B) B,D,E FROM test GROUP BY D,E,A ORDER BY D,E,A;
      

  2.   

    A列的10对应着B列的 tec1,tec2;A列的20也对应着B列的tec1,tec2;那么就任意分配tec1,tec2给A列的10和20。使其成为 10 tec1,20 tec2 或者 10 tec2,20 tec1。可以成为 10 tec1,20 tec1或者 10 tec2,20 tec2吗
      

  3.   


    不成,其实就是想 把A列的数据唯一,唯一的规则就是如果A列的某个值与表中其他值所对应的B列数据相同的话,就分别对应一个。
      

  4.   

    所以就只有两种结果 10 tec1,20 tec2 或者 10 tec2, 20 tec1
      

  5.   

    最后得到的数据,如下所示: A B D E 
    10 tec1 3 100101 
    20 tec2 3 100101 
    30 tec3 3 100101 
    40 tec4 3 100101 
    11 tec1 4 100101 
    21 tec1 4 100101 
    31 tec3 4 100101 
    41 tec4 4 100101 ==============================================
    那结果中怎么出现了
    11 tec1 4 100101 
    21 tec1 4 100101 

      

  6.   

    SELECT A,MIN(B) B,D,E FROM test where A <> 20 GROUP BY A union SELECT A,Max(B) B,D,E FROM test where A = 20 GROUP BY A 
      

  7.   


    不好意思,这里写错了,
    11 tec1 4 100101
    21 tec2 4 100101
      

  8.   

    不好意思,或许我没说明白
    在D、E列完全相同的情况下,
    如果A列里有某个数据 对应的B列的数据有3个值,那A列里就会有3条数据对应着 B列的这3个值。
    比如说 A列里 10 对应着B列tec1,tec2,tec3。那么A列里肯定就会有 11 或12 也对应着 tec1,tec2,tec3
    换句话说 这个表中就会有 9条数据:
      10  tec1
      10  tec2
      10  tec3
      11  tec1
      11  tec2
      11  tec3
      12  tec1
      12  tec2
      12  tec3
    我现在就是要把这9条数据变成3条数据,让10,11,12分别对应着其中的一个值
    即 或者 10  tec1,11  tec2,12 tec3
      或者  10  tec2,11 tec3,12 tec1
      或者  10  tec3,11 tec1,12 tec2呵呵~ 谢谢大家,记得以前有这样的帖子,没找到,急着用!多谢大家了!
      

  9.   

    SELECT A,B,x.D D,x.E E FROM 
    (SELECT A,ROW_NUMBER() OVER(ORDER BY A) no,D,E FROM test GROUP BY D,E,A) x,
    (SELECT B,ROW_NUMBER() OVER(ORDER BY B) no,D,E FROM test GROUP BY D,E,B) y
    WHERE x.D = y.D AND x.E = y.E AND x.no = y.no ORDER BY D,E,A;
      

  10.   

    select a,
      max(decode(rn1,rn2,b)) b,
      d,e
    from (
      select a,b,d,e,rownum rn, row_number()over(partition by a,d,e order by b)rn1,
        row_number()over(partition by b,d,e order by a)rn2 from test1)
    group by a,d,e
    order by max(rn) 
    rownum和order by max(rn)是为了方便楼主进行比较添加的
    可以去掉