database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 1861 게시물 읽기
No. 1861
오라클 쿼리인데요.. MS-SQL 로 바꾸려고....ㅡㅡ
작성자
궁금이
작성일
2005-04-02 03:50
조회수
5,786

다음과 같은 오라클 쿼리가 있습니다..

이것을 MSSQL 쿼리로 바꾸려는데요.. 도저히 같은 결과가 나오게끔 바꿔지지가 않아서

질문글을 올립니다.

 

SELECT
'1' GBN -- 매출
,SUBSTR(A.OUTPUT_DATE,1,6)||'01' OUTPUT_DATE
,MIN(A.DB_CODE)
,MIN(A.IVNC_CODE1)
,A.TAXSHEET_ORDNO ORD_NO
,MIN(A.TAXSHEET_GUBUN)
,MIN(A.COMP_NO)
,A.VAT_TYPE
,MAX(A.GOOD_CODE) GOOD_CODE
,COUNT(A.GOOD_CODE) GOOD_CNT
,NVL(SUM(A.OUTPUT_GONG)-NVL(SUM(B.OUTPUT_GONG),0),0) OUTPUT_GONG
,NVL(SUM(A.OUTPUT_VAT)-NVL(SUM(B.OUTPUT_VAT),0),0) OUTPUT_VAT
FROM IO_OUTPS A , OR_ORDMM C,
( SELECT SUBSTR(A.RET_DATE,1,6) RET_DATE
,A.DB_CODE
,A.IVNC_CODE
,B.VAT_TYPE
,B.TAXSHEET_RETNO
,SUM(DECODE(B.VAT_TYPE,'Y', round(b.dano_mv/1.1)*b.ret_qty,b.dano_mv*b.ret_qty)) OUTPUT_GONG
,SUM(DECODE(B.VAT_TYPE,'Y', (b.dano_mv-round(b.dano_mv/1.1))*b.ret_qty,0)) OUTPUT_VAT
FROM IO_RETMM A, IO_RET1S B
WHERE A.RET_NO = B.RET_NO
AND A.DB_CODE = B.DB_CODE
AND B.TAXSHEET_GUBUN = 'A'
GROUP BY SUBSTR(A.RET_DATE,1,6),A.DB_CODE, A.IVNC_CODE, A.RET_NO, B.COMP_NO, B.VAT_TYPE,B.TAXSHEET_RETNO
) B
WHERE A.TAXSHEET_GUBUN = 'A' -- 월합매출
AND SUBSTR(A.OUTPUT_DATE,1,6) = B.RET_DATE(+)
AND A.DB_CODE = B.DB_CODE(+)
AND A.IVNC_CODE1 = B.IVNC_CODE(+)
AND A.TAXSHEET_ORDNO = B.TAXSHEET_RETNO(+)
AND A.VAT_TYPE = B.VAT_TYPE(+)
AND A.DANO_MV > 0
AND A.ORDERNO = C.ORD_NO
AND A.DB_CODE = C.DB_CODE
AND C.ORD_KIND IN ('1','2')
GROUP BY SUBSTR(A.OUTPUT_DATE,1,6),A.VAT_TYPE, A.TAXSHEET_ORDNO, A.DB_CODE

 

이런 쿼리를 MSSQL 로 바꿀수 있을까요..

이틀을 꼬박 고생해보다가 고수님들께 조언을 받고자 글을 올립니다...ㅡㅜ

기본적으로 DECODE 부분은 CASE WHEN THEN.,, 을 이용하여 바꾸고.. 문법도 바꾸어보고.했는데요

(+) 부분... Left join 을 걸어야 한다는데..

 

도저히 되지를 않네요..

조언이나 쿼리 바꾸어주시면 감사드리겠습니다.

 

수고들 하십시요

 

이 글에 대한 댓글이 총 1건 있습니다.

오라클과 SQL Server나 아우터조인에 대한 기본적인 것은 차이가 없습니다.

다만 오라클은 안시방식이나 (+)방식이나 같은 방식으로 작동하고..

SQL Server는 안시방식과 *방식이 다르게 작동한다는 차이가 있을 뿐.

그래서 SQL Server에서 아우터조인을 쓰시려면 안시방식으로 써야만

원하는 형태대로 나오는 것입니다.(*방식은 아예 안쓰는 것이 나음)

 

예를 들어 오라클의 문장이 아래와 같다면..

SELECT A.COL3

            ,B.COL4

FROM TAB1 A

         ,TAB2 B

WHERE A.COL1 = B.COL1(+)

AND A.COL2 = B.COL2(+)

AND A.COL5 = 'Y'

 

위를 안시방식으로 바꾸면..

 

SELECT A.COL3

            ,B.COL4

FROM TAB1 A

LEFT OUTER JOIN TAB2 B

ON (A.COL1 = B.COL1

AND A.COL2 = B.COL2)

WHERE A.COL5 = 'Y'

 

저는 나름대로 (+) 기호는는 없어도 있어도 그만 없어도 그만으로 이해하고..

LEFT OUTER JOIN은 왼쪽의 테이블 중심으로 이해하고 있습니다.

그러면 특별히 헷갈릴 것은 없죠..

 

안시방식에서 TAB2가 있으면 꼭 나와라 이렇게 쓰려면..

윗문장은 그대로 두고 조인만 RIGHT OUTER JOIN만 바꾸면 되겠죠..

근데 이렇게 쓰면 너무 헷갈릴 수 있으니까.. 또 보통은 중심테이블을

왼쪽에 두는 경향이 있으므로.. LEFT OUTER JOIN은 그냥 두고..

테이블의 위치만 바꾸어 주죠.. 어느 방식이든.. 왼쪽이 중심이되고..

오른쪽은 부가적인 부분이 되도록 말이죠..

다만 이런 경우에 상수조건에는 주의를 요합니다. 

A.COL5 = 'Y'는 아우터조인에서 중심테이블의 조건이라면 별 관계없지만..

부가테이블쪽의 조건이라면 조인절에 쓸 것인지 where 절에 쓸 것인지에 따라 상당히 달라지게 됩니다.

즉 조인절(ON 다음에 )에 쓰면 원래의 중심테이블의 출력에 관계없이

부가테이블의 내용을 체크하는 조건이 되고...

WHERE절에 쓰게 되면 최종출력을 체크한다는 개념으로 아우터조인의 원래 의미를 망가뜨릴 수 도 있으니까..

보통은 부가테이블의 상수조건은 조인절에 쓰는 것이 맞습니다..

위의 경우라면 오라클은 A.COL5(+) = 'Y' 로 표현할 수 있겠죠..

 

말이 길어졌는데..

하여간 조금만 응용하시면 원래의 문장도 맞게 나올 수 있을 겁니다..

 

M님이 2005-04-04 09:52에 작성한 댓글입니다.
이 댓글은 2005-04-04 10:13에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1864리눅스에서 freetds 설치중 이런 에러는 어떻게 처리하는지요..ㅠ.ㅠ [1]
최헌
2005-04-04
2042
1863여러행을 한행으로 만드는 쿼리가 가능한지요. [2]
청년재벌
2005-04-02
3417
18628007007f 이 에러는 어떻게 해결하나요?
bluepotal
2005-04-02
2553
1861오라클 쿼리인데요.. MS-SQL 로 바꾸려고....ㅡㅡ [1]
궁금이
2005-04-02
5786
1859회원로그인 하는 부분중에서.....질문 [3]
최중권
2005-03-31
13377
1858새로운 필드를 추가시키려면... [1]
고영훈
2005-03-31
2395
1857통계 쿼리 좀 봐주십시요. [5]
참치
2005-03-30
2953
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다