쿼리 질문 드립니다. 정말 급해서요 ㅠ 0 6 1,223

by idoris [2018.02.19 16:47:24]


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 안쓰고 쿼리를 해야 합니다.

방법이 있을까요??

by 우리집아찌 [2018.02.19 16:56:18]
-- 그런데 프로그램 제약상이랑 SQL이랑 뭔 상관이죠?
SELECT MIN(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');

 


by 마농 [2018.02.19 16:59:03]

제약이 너무 많네요.
왜 그런 제약이 있는지? 납득이 갈만한 설명 부탁드려요.
왠지? 다른 방법 제시하면. 그것도 안되요~ 할 것 같아서 그래요.


by idoris [2018.02.19 17:13:02]

먼저 답변 감사드립니다.

프로그램 제약이라는 말은 제가 잘못적었네요;;  그 부분은 빼주세요;; 죄송합니다.

전체 쿼리는 아래와 같은데..

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를 구해야 하거든요..

쿼리를 어떻게 해야 할까요?;;

오래 고민해봤는데, 저한테는 너무 어렵네요;;

도움 부탁드립니다.
 


by 우리집아찌 [2018.02.19 17:31:56]

원하시는 순서로 ORDER BY 하시고 INLINE VIEW 로 묶어서 ROWNUM <= 1 하시면 안되나요?

오라클 버젼이 12C이면 다른방법도 될거같고.. 

마농님이 잘 적어주실듯..

 


by 마농 [2018.02.19 17:31:00]

타입은 3개 고정에 순서도 고정인가요?
그러면 공교롭게도 타입 정렬순서대로 우선순위가 되네요.
order by 해서 rownum = 1 하면 됩니다.
row_number 를 이용해도 되구요.
타입의 값이나 갯수나 순서가 가변이라면? 그에 대한 추가 설명 필요합니다.
 

SELECT *
  FROM (SELECT ...
          FROM ...
         WHERE ...
         ORDER BY e.contact_type_cd
        )
 WHERE ROWNUM = 1
;

 


by idoris [2018.02.19 17:44:52]

두 분 모두 답변 감사합니다!! ^^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입