중복을 포함한 전체값 조회? 0 6 1,243

by 엘리프 [PL/SQL] 중복 [2015.12.08 20:16:32]


Ordertable => 3월 ~ 11월 전체 주문 데이터

 

Ordertable에서 회원을 전체 조회하고,

11월에 주문한 회원에게만 점수를 부여하고,

나머지 날짜에 속한 회원(11월에 주문한 회원을 제외한 나머지 회원)에게는 점수 0을 부여해서

Ordertable 전체 회원들의 점수를 보여줄려고 합니다.

서브 쿼리를 엮는게 감이 안와서요..

by terry0515 [2015.12.08 23:02:02]
서브쿼리로 하실필요도 없이 case 문으로 가능할듯한데요?

하기쿼리 참고하셔서 실제 테이블과 컬럼으로 기술하시면 되겠네요.


Select a.*
, case a.주문일자 = '11월' then 점수
Else 0
End as 점수
From ordertable a

by 엘리프 [2015.12.09 00:24:16]

음 그러면 아래처럼과도 같이 가능할수도 있을까요.?

SELECT
   case
        SELECT
            case
           end
   end
from

 


by terry0515 [2015.12.09 08:42:20]

가능은 합니다.

 

  Select (
                   Case When 조건

                                   Then ( Select ~~~ )

                           Else ( Select ~~~ )

                  End

           )
 

로 하시면 가능해요..

단 서브쿼리에서는 multirow 가 나오게 하시면 오류가 납니다..

1개의 결과row에 대한 서브쿼리이니..


by 엘리프 [2015.12.09 11:36:02]

멀티는 안되는군요...ㅠㅠ

답변 고맙습니다.


by 마농 [2015.12.09 09:25:01]

주문테이블 전체를 읽어 회원번호로 그룹바이 한뒤
Case 문으로 11월 주문을 확인하여 점수를 부여합니다.
이방식은 대량의 전체 주문테이블을 다 읽어야 하므로 성능이 좋지 않을 것으로 예상되네요.
 

SELECT id
     , NVL(MAX(CASE WHEN OrderDt LIKE '201511%' THEN 1 END), 0) jumsu
  FROM Ordertable
 GROUP BY id
;

다음 방식은
회원테이블을 읽어 서브쿼리로 주문테이블을 체크하는 방식입니다.
주문테이블에 (회원번호 + 주문일자) 인덱스가 있을 경우 효과적입니다.
 

SELECT c.id
     , (SELECT NVL(MAX(1), 0)
          FROM Ordertable o
         WHERE o.id = c.id
           AND o.OrderDt LIKE '201511%'
           AND ROWNUM = 1
        ) jumsu
  FROM CustomerTable c
;

 


by 엘리프 [2015.12.11 17:51:36]

조그 간단하게 해결했습니다.

회원만 따로 모아놓은 DB 테이블이 있다고 해서

해당 DB의 회원 전체를 불러와서 union all로 합치고,

점수를 계산해서 합쳐버렸습니다.

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