안녕하세요.
이번에 쿼리를 하나 짜려고 하는데
A테이블 | B테이블 | |||
key | name | key | name | |
1 | C | 1 | C | |
2 | A | 2 | A | |
3 | B | 3 | B | |
4 | A | 4 | A | |
5 | A | |||
6 | B | |||
7 | C | |||
8 | D | |||
9 |
E |
위와 같이 두개의 테이블이 있는데 B테이블에 VALUE 값 중 한건만 승인이 가능합니다.
다만 여기서 예외 조항이 있는게 A테이블에 있는건 무조건 승인을 해야 하는데요.
결과는 다음과 같이 나와야 합니다.
결과값 | ||
1 | C | 승인 |
2 | A | 승인 |
3 | B | 승인 |
4 | A | 승인 |
8 | D | 승인 |
9 | E | 승인 |
5 | A | 취소 |
6 | B | 취소 |
7 | C | 취소 |
한주 마무리 하는 금요일에 머리가 아프네요. ㅜ
답변 달아주시는분께 미리 감사드립니다.
with a(key,name) as(
select 1,'C' from dual
union all
select 2,'A' from dual
union all
select 3,'B' from dual
union all
select 4,'A' from dual)
,b(key,name) as(
select 1,'C' from dual
union all
select 2,'A' from dual
union all
select 3,'B' from dual
union all
select 4,'A' from dual
union all
select 5,'A' from dual
union all
select 6,'B' from dual
union all
select 7,'C' from dual
union all
select 8,'D' from dual
union all
select 9,'E' from dual)
select key,name,case when cnt2=1 or cnt2 is null or cnt2<=cnt then '승인' else '취소' end as status
from
(
select case when cnt>0 then count(name)over(PARTITION by name order by key) end cnt2,cnt,name,key
from (select key,name,
(select count(*) from a where a.name=b.name) as cnt
from b)
)
order by key;
WITH A AS ( SELECT 1 KEY, 'C' NAME FROM DUAL UNION ALL SELECT 2 KEY, 'A' NAME FROM DUAL UNION ALL SELECT 3 KEY, 'B' NAME FROM DUAL UNION ALL SELECT 4 KEY, 'A' NAME FROM DUAL ) , B AS ( SELECT 1 KEY, 'C' NAME FROM DUAL UNION ALL SELECT 2 KEY, 'A' NAME FROM DUAL UNION ALL SELECT 3 KEY, 'B' NAME FROM DUAL UNION ALL SELECT 4 KEY, 'A' NAME FROM DUAL UNION ALL SELECT 5 KEY, 'A' NAME FROM DUAL UNION ALL SELECT 6 KEY, 'B' NAME FROM DUAL UNION ALL SELECT 7 KEY, 'C' NAME FROM DUAL UNION ALL SELECT 8 KEY, 'D' NAME FROM DUAL UNION ALL SELECT 9 KEY, 'E' NAME FROM DUAL ) SELECT KEY, NAME, CASE WHEN AEX = 'Y' OR RN = 1 THEN '승인' ELSE '취소' END APPYN FROM ( SELECT B.KEY, B.NAME ,ROW_NUMBER() OVER (PARTITION BY B.NAME ORDER BY B.KEY) RN ,DECODE(A.KEY,NULL,'N','Y') AEX FROM B , A WHERE B.KEY = A.KEY(+) ORDER BY B.KEY ) ORDER BY APPYN, KEY
우앙 다들 빠르시당ㅋ
with t as ( select 1 key , 'C' name from dual union all select 2 key , 'A' name from dual union all select 3 key , 'B' name from dual union all select 4 key , 'A' name from DUAL ) , TT AS( select 1 key , 'C' name from dual union all select 2 key , 'A' name from dual union all select 3 key , 'B' name from dual union all select 4 key , 'A' name from dual union all select 5 key , 'A' name from dual union all select 6 key , 'B' name from dual union all select 7 key , 'C' name from dual union all select 8 key , 'D' name from dual union all select 9 key , 'E' name from dual ) SELECT TT.KEY , TT.NAME , DENSE_RANK() OVER(ORDER BY T.NAME ASC) A , CASE WHEN T.NAME = TT.NAME THEN '승인' WHEN RANK( ) OVER (PARTITION BY TT.NAME ORDER BY TT.KEY ASC) =1 THEN '승인' ELSE '취소' END 결과 FROM TT, T WHERE TT.KEY = T.KEY(+)
WITH TA(KEY,NAME) AS( SELECT 1, 'C' FROM DUAL UNION ALL SELECT 2, 'A' FROM DUAL UNION ALL SELECT 3, 'B' FROM DUAL UNION ALL SELECT 4, 'A' FROM DUAL ) , TB(KEY,NAME) AS( SELECT 1, 'C' FROM DUAL UNION ALL SELECT 2, 'A' FROM DUAL UNION ALL SELECT 3, 'B' FROM DUAL UNION ALL SELECT 4, 'A' FROM DUAL UNION ALL SELECT 5, 'A' FROM DUAL UNION ALL SELECT 6, 'B' FROM DUAL UNION ALL SELECT 7, 'C' FROM DUAL UNION ALL SELECT 8, 'D' FROM DUAL UNION ALL SELECT 9, 'E' FROM DUAL ) SELECT TB.KEY, TB.NAME , CASE WHEN TA.CNT >= ROW_NUMBER() OVER(PARTITION BY TB.NAME ORDER BY TB.KEY) OR TA.NAME IS NULL -- A테이블에 없는 NAME인 경우 승인처리 THEN '승인' ELSE '취소' END VAL FROM ( SELECT NAME, COUNT(*) CNT FROM TA GROUP BY NAME ) TA , TB WHERE TA.NAME(+) = TB.NAME ORDER BY 3,1 ;
jkson님은 저랑 비슷한 생각을 하셨군요..