我有一个表, 表名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' 的内容.
我想了很久没想出来, 请大虾们帮忙想一下.
其中有两个column , AE_ID 和 ACC_NUM,这两组column中的数据都是有重复的.
我想在这两个column 中找出 同一个ACC_NUM 中有两个不同的AE_ID , 然后用 'Y' 表示.
如果一个ACC_NUM 中相对应只有一个AE_ID , 则用'N' 表示.
最后显示 AE_ID,ACC_NUM,'Y' or 'N' 的内容.
我想了很久没想出来, 请大虾们帮忙想一下.
from (
select acc_num,count(*) num
from aaa
group by acc_num)
from AAA a ,(
select acc_num,count(*) num
from AAA
group by acc_num) b
where a.acc_num=b.acc_num
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;
select ACC_NUM,count(distinct AE_ID) lCount from AAA group by ACC_NUM)
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
看数据是否你想要的!
建议日后这种问题最好有实例,这样子更快解决!
我想要的最终结果是 ae_id , 'Y' 或 'N'.
最终显示的对像是AE_ID 是 'Y' 还是 'N'
如果一个ae_id 中有一个acc_num 是 'Y' 的,那么这个AE_ID
的结果就是 'Y' , ACC_NUM 是不用显示出来的,它只是一个过渡条件.
---------- ----------
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
---------- ----------
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
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共享了)
这就是我的完整需求了, 还请大家不吝指教.
如果将你的例子,把ACC_NUM与AE_ID对换一下,
也是得不到我想要的结果的.
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
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
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
在同事的帮助下终于用一个比较简单的办法解决了, 贴上来, 大家互相学习一下.