2014-07-25 4 views
0

이것은 Oracle SQL에 있습니다. 나는 테이블을 변경할 수없고 이미있는 것을 쿼리 만 할 수 있습니다.where 또는 join 문의 열 값을 열거하십시오.

주소 유형이 다른 테이블이 있습니다. 기본, 우편물, 위치, EOB. 나는 다른 사람들에게 보낸 수 표를 가지고있다.

Addresses 
Group_ID    Type  
01     Primary 
02     Location 
02     Primary 
03     Mailing 
03     EOB 

Checks 
AMT     Group_ID 
350.05    01 
410.62    02 
    1.05    03 

주소 유형을 주, 우편, EOB, 위치로 순위를 매기는 우선 순위 목록이 있습니다. 그 그룹 ID에 대해 나열된 가장 높은 주소 유형의 수표를 반환하는 등 JOIN 또는 WHERE 문을 작성하는 방법을 알아 내려는 중입니다.

예 :

AMT  Group_ID Type 
350.05  01   Primary 
410.62  02   Primary 
    1.05  03   Mailing 

등 본래 위치의 유형을 열거 및 MIN 값을 복용. 불행히도 순위 열을 추가 할 수 없습니다.

답변

1

당신은 ROW_NUMBER() 기능과이 작업을 수행 할 수있는 CASE 문을 사용할 수 있습니다 :

; 
WITH cte AS (SELECT "AMT" 
        ,a."Group_ID" 
        ,b."Type" 
        ,ROW_NUMBER() OVER(PARTITION BY a."Group_ID" 
             ORDER BY CASE WHEN b."Type" = 'Primary' THEN 1 
                 WHEN b."Type" = 'Mailing' THEN 2 
                 WHEN b."Type" = 'Location' THEN 3 
                 WHEN b."Type" = 'EOB' THEN 4 
                 ELSE 5 
                END) AS RN 

       FROM Checks a 
       JOIN Addresses b 
       ON a."Group_ID" = b."Group_ID" 
       ) 
SELECT "AMT","Group_ID","Type" 
FROM cte 
WHERE "RN" = 1 

데모 : SQL Fiddle

또한 같은 방식으로 순위 기능을 사용할 수 있습니다.

1

또 다른 가능성은 아래와 같습니다. 내부 쿼리에서 MAX()Type으로 가져 와서 합치면됩니다. 발생합니다

select c.AMT, 
tab."Group_ID", 
tab.max_type 
from checks c 
join 
(
select "Group_ID", 
max("Type") as max_type 
from Addresses 
group by "Group_ID" 
) tab on c."Group_ID" = tab."Group_ID" 

:

AMT  GROUP_ID MAX_TYPE 
350  1   Primary 
411  2   Primary 
1  3   Mailing 

DEMO Here

+1

이것은이 샘플 데이터와 일치하는 경우에만 작동합니다. 값이 변하지 않거나 샘플 데이터가 포괄적이지 않으면 문제가되지 않습니다. –

+0

그게 사실 일 수 있습니다. 나는 문제 진술과 샘플 데이터를 보냈다. – Rahul

+0

나는 그들이 알파벳 순서가 반대로되어 있다는 사실을 결코 생각하지 못했다 ... –

1

를 참조 이것은 GoatCO의 솔루션 @에 약간의 변형입니다. 분석 기능을 수행하기 때문에 선호합니다. 전에보다 나중에 join?

SELECT c.amt, c.Group_ID, a.Type 
FROM checks c left join 
    (select a.*, 
      row_number() over (partition by a.Group_ID 
           order by (case when a."Type" = 'Primary' then 1 
               when a."Type" = 'Mailing' then 2 
               when a."Type" = 'Location' then 3 
               when a."Type" = 'EOB' then 4 
               else 5 
             ) 
           ) as seqnum 
     from addresses a 
    ) a 
    on c.Group_ID = a.Group_id and a.seqnum = 1;