SELECT CONTACT_TYPE_CD
FROM HMA_MDM.D_DEALER_CONTACT E
WHERE DEALER_CD = 'PA065'
AND E.GEO_LATITUDE IS NOT NULL
AND E.GEO_LONGITUDE IS NOT NULL
AND E.CONTACT_TYPE_CD IN ('PSVC','PSVC_ACTUAL','SHOW');
CONTACT_TYPE_CD |
PSVC |
PSVC_ACTUAL |
SHOW |
위와 같은 타입이 존재할 때,
PSVC 가 있으면 PSVC 1건만 조회되고,
PSVC가 없고 PSVC_ACTUAL 이 있으면 PSVC_ACTUAL 1건만 조회되고,
위에 2개 다 없으면 SHOW만 조회되게 하려면 쿼리를 어떻게 짜야 할까요?
프로그램 제약상,
RANK ,ROWNUM 함수나 GROUP BY 같은 그룹함수 안 쓰고, 또 ORDER BY - ROWNUM =1 안쓰고 쿼리를 해야 합니다.
방법이 있을까요??
먼저 답변 감사드립니다.
프로그램 제약이라는 말은 제가 잘못적었네요;; 그 부분은 빼주세요;; 죄송합니다.
전체 쿼리는 아래와 같은데..
SELECT /*+ ORDERED USE_NL(A B D E) */
A.GROUP_ID,
D.DEALER_CD,
B.GEO_LATITUDE AS CON_GEO_LATITUDE,
B.GEO_LONGITUDE AS CON_GEO_LONGITUDE,
E.GEO_LATITUDE AS DLR_GEO_LATITUDE,
E.GEO_LONGITUDE AS DLR_GEO_LONGITUDE,
CASE
WHEN (B.GEO_LATITUDE = E.GEO_LATITUDE
AND B.GEO_LONGITUDE = E.GEO_LONGITUDE) THEN 0
ELSE ROUND( 3949.99 * ACOS(SIN((ATAN(1)/45) * B.GEO_LATITUDE) * SIN((ATAN(1)/45) * E.GEO_LATITUDE) + COS((ATAN(1)/45) * B.GEO_LATITUDE) * COS((ATAN(1)/45) * E.GEO_LATITUDE) * COS((ATAN(1)/45) * B.GEO_LONGITUDE - (ATAN(1)/45) * E.GEO_LONGITUDE) ), 0)
END AS DIFF_MILES,
A.SOURCE_ID,
CONTACT_TYPE_CD
FROM HMA_MDM.C_CUSTOMER A,
HMA_MDM.C_CUSTOMER_ADDRESS B,
HMA_MDM.D_DEALER D,
HMA_MDM.D_DEALER_CONTACT E
WHERE A.C_CUSTOMER_ID = B.C_CUSTOMER_ID
AND D.D_DEALER_ID = E.D_DEALER_ID
AND B.IS_PRIMARY_ADDRESS = 1
AND D.IS_ACTIVE = 1
AND B.GEO_LATITUDE IS NOT NULL
AND E.GEO_LATITUDE IS NOT NULL
AND B.GEO_LONGITUDE IS NOT NULL
AND E.GEO_LONGITUDE IS NOT NULL
AND D.DEALER_CD = 'PA065'
AND A.GROUP_ID = '14472534'
AND CONTACT_TYPE_CD IN ( 'PSVC', 'PSVC_ACTUAL','SHOW');
결과가 하나의 DEALER 당 CONTACT_TYPE_CD가 3개씩 걸리고,
그 것들 중에서, 위에 언급한대로 우선순위가 있는데,
우선순위에 따라 하나만 조회되게 해서, 위에 하이라이트한 DEALER - CONTACT 의 주소 DISTANCE를 구해야 하거든요..
쿼리를 어떻게 해야 할까요?;;
오래 고민해봤는데, 저한테는 너무 어렵네요;;
도움 부탁드립니다.