오라클 - > MSSQL 전환 0 8 1,196

by sealpark [SQLServer] 오라클 MSSQL [2022.07.27 16:04:42]



안녕하세요. 제목처럼 ORCLE -> MSSQL로 전환하고 있습니다.

SELECT COUNT(1) AS MAX_ORD
     , MAX(CASE WHEN (IN_DAERIJA_ID IS NULL AND B.GYEOLJAEJA_ID = IN_GIANJA_ID AND B.GYEOLJAEJA_ID_GB = IN_GIANJA_ID_GB) OR (IN_DAERIJA_ID IS NOT NULL AND (B.GYEOLJAEJA_ID, B.GYEOLJAEJA_ID_GB) = (
                                                                                                                                                                                                   SELECT GYEOLJAEJA_ID
                                                                                                                                                                                                        , GYEOLJAEJA_ID_GB
                                                                                                                                                                                                     FROM EA_USER_SEOLJEONG_M
                                                                                                                                                                                                    WHERE DAERIJA_ID    = IN_GIANJA_ID
                                                                                                                                                                                                      AND DAERIJA_ID_GB = IN_GIANJA_ID_GB
                                                                                                                                                                                                      AND DAERIJA_YN    = '1'
                                                                                                                                                                                                   )) THEN ORD
                ELSE                                                                                                                                                                                       1
            END) AS ORD
     , SUM(CASE WHEN GYEOLJAE_ST_GB = '1' THEN 1 ELSE 0 END) AS GYEOLJAE_CNT
  INTO V_MAX_ORD, V_ORD, V_GYEOLJAE_CNT
  FROM EA_GYEOLJAE_M A
  JOIN EA_GYEOLJAE_D B
    ON A.GYEOLJAE_NO = B.GYEOLJAE_NO
 WHERE A.GYEOLJAE_NO = IN_GYEOLJAE_NO;

이게 ORCLE 로직입니다.

 

현재 바꾼게 해당 사진과 아래의 소스입니다

SELECT @V_MAX_ORD = COUNT(1)
				 , @V_ORD = MAX(CASE WHEN (@IN_DAERIJA_ID IS NULL AND B.GYEOLJAEJA_ID = @IN_GIANJA_ID AND B.GYEOLJAEJA_ID_GB = @IN_GIANJA_ID_GB) 
				   OR (@IN_DAERIJA_ID IS NOT NULL AND B.GYEOLJAEJA_ID = (
																		SELECT GYEOLJAEJA_ID
																		  FROM EA_USER_SEOLJEONG_M
																		 WHERE DAERIJA_ID    = @IN_GIANJA_ID
																		   AND DAERIJA_ID_GB = @IN_GIANJA_ID_GB
																		   AND DAERIJA_YN    = '1'
																		)
				   AND @IN_DAERIJA_ID IS NOT NULL AND B.GYEOLJAEJA_ID_GB = (
																		   SELECT GYEOLJAEJA_ID_GB
																			 FROM EA_USER_SEOLJEONG_M
																			WHERE DAERIJA_ID    = @IN_GIANJA_ID
																			  AND DAERIJA_ID_GB = @IN_GIANJA_ID_GB
																			  AND DAERIJA_YN    = '1'
																		   )) THEN ORD ELSE 1 END)
			     , @V_GYEOLJAE_CNT = SUM(CASE WHEN GYEOLJAE_ST_GB = '1' THEN 1 ELSE 0 END)
			  FROM EA_GYEOLJAE_M A
			  JOIN EA_GYEOLJAE_D B
			    ON A.GYEOLJAE_NO = B.GYEOLJAE_NO
			 WHERE A.GYEOLJAE_NO = @IN_GYEOLJAE_NO;

잘 안되는게 아래 사진 블럭처리 된 부분입니다.

SUM 함수나 COUNT 같은 함수를 사용할땐 오류가 없는데

빨간색 부분을 추가하면 집계 또는 하위 쿼리가 포함된 식에서는 집계 함수를 수행할 수 없습니다. 라고 오류가 발생합니다.

어떤식으로 바꿔야할 지 도움 주시면 감사하겠습니다.

 

소스가 지저분해 죄송합니다 

by 우리집아찌 [2022.07.27 16:40:37]

빨간색은 어디 부분일까요?

 


by sealpark [2022.07.28 09:30:53]

게시글 내용 수정했습니다!
빨간색이 아닌 맨 아래 사진의 블럭처리한 부분입니다.


by 우리집아찌 [2022.07.28 09:37:40]

해당블럭의 서브쿼리에서 두건이상 데이터가 추출되진 않나요?


by sealpark [2022.07.28 11:16:54]

아찌님 답변 감사합니다. 

첫번째 쿼리를 보시면 오른쪽으로 넘기면 다중컬럼으로 비교해서 처리를 하는데요 그러다 보니 두건이상의 데이터 처리를 하는데 이걸 어떤식으로 변경해야할 지 감이 안오네요 ㅠ 


by 우리집아찌 [2022.07.28 11:22:22]

같은값이 맞다면 1건만 가지고 오면 되는데 다른값이면 어떤것을 가지오 올지 정해야합니다.

같은값이면 top(1) , MAX , MIN 같은걸로 하져오면 되고

다르면 MAX (큰값) , MIN(작은값) 같은걸로 선택해야할겁니다.


by 우리집아찌 [2022.07.29 09:31:37]

안해봤는데 = 대신 IN 이 될지 모르겠네요.


by 마농 [2022.08.01 08:53:03]

CONCAT 으로 두개 항목 붙여서 비교하세요.


by 마농 [2022.08.01 09:27:16]
-- Outer Join 으로 풀어보는건 어떤지요? --
SELECT @V_MAX_ORD = COUNT(1)
     , @V_ORD = MAX(CASE WHEN (@IN_DAERIJA_ID IS NULL AND B.GYEOLJAEJA_ID = @IN_GIANJA_ID AND B.GYEOLJAEJA_ID_GB = @IN_GIANJA_ID_GB) THEN 1
                         WHEN (@IN_DAERIJA_ID IS NOT NULL AND C.GYEOLJAEJA_ID IS NOT NULL) THEN 1
                    ELSE 0 END)
     , @V_GYEOLJAE_CNT = COUNT(CASE WHEN GYEOLJAE_ST_GB = '1' THEN 1 END)
  FROM EA_GYEOLJAE_M A
  JOIN EA_GYEOLJAE_D B
    ON A.GYEOLJAE_NO = B.GYEOLJAE_NO
  LEFT OUTER JOIN EA_USER_SEOLJEONG_M C
    ON C.GYEOLJAEJA_ID    = B.GYEOLJAEJA_ID
   AND C.GYEOLJAEJA_ID_GB = B.GYEOLJAEJA_ID_GB
   AND C.DAERIJA_ID       = @IN_GIANJA_ID
   AND C.DAERIJA_ID_GB    = @IN_GIANJA_ID_GB
   AND C.DAERIJA_YN       = '1'
 WHERE A.GYEOLJAE_NO = @IN_GYEOLJAE_NO
;

 

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