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 3614 게시물 읽기
No. 3614
쿼리 질문입니다.
작성자
질문..
작성일
2007-07-05 16:17ⓒ
2007-07-05 16:18ⓜ
조회수
3,283


안녕하세요. 테이블 4개를 조인하여 데이타를 가져와야 합니다.

물론 소스로 처리할수도 있겠지만, 쿼리에 익숙치 못하여, 여러 선배님들의 조언으로

한수 배우고자 합니다. 도움 부탁드리겠습니다 ^^;;


<테이블 1>

테이블 명 : matmst01

필드 명    : center_cd, asset_div, partac_cd, partpr_cd, stock_cnt

<테이블 2>

테이블 명 : inoutx01

필드 명    : center_cd, partac_cd, partpr_cd, in_cnt, out_cnt

<테이블 3>

테이블 명 : partac01

필드 명    : partac_cd, partac_nm

<테이블 4>

테이블 명 : partpr01

필드 명    : partpr_cd, partpr_nm


조건 : 

1번 테이블을 기준으로하여, 2번 테이블과 LEFT OUTER JOIN을 하여,

1번 테이블과 2번 테이블의 센터가 같은 데이타를 추출하고,

1번 테이블의 partac_cd, partpr_cd가 같은 품목을 그룹핑하여 sum(stock_cnt)를 구하고,

2번 테이블과 1번 테이블의 partac_cd, partpr_cd이 같은 in_cnt와, out_cnt를 SUM합니다. 


그리고 위의 결과값에서 partac_cd, partpr_cd를 가지고 테이블 3, 4에서 

이름을 가져옵니다.


===============================================================================

일단 쿼리를 이렇게 작성하였습니다.

그런데 이름을 가져오려고 하니, c.partac_nm이 그룹핑되지 않았다면서 가져오질 못하여,

partac_nm을 그룹핑 하였더니, 원래 ROW는 208개였는데 갯수가 107개로 줄어버립니다.

뭔가 이상한거 같아서 이렇게 질문을 드리게 되었습니다.


GROUPING을 명확하게 이해하지 못하여 발생하는 오류 같은데,

선배님들의 조언 부탁드리겠습니다 (__)


-- 작성 쿼리

select

    CASE a.asset_div

      WHEN 'TT0001' THEN '상품'

      WHEN 'TT0002' THEN '저장품'

    END AS asset_div,              

    a.partacc_cd,

    c.partac_nm,

    a.partptr_cd,

       SUM(a.stock_cnt) stock_cnt,

       SUM(isNull(b.in_cnt,0)) in_cnt,

       SUM(isNull(b.out_cnt,0)) out_cnt

 from matmst01 a left outer join

   inoutx01 b ON a.center_cd = b.center_cd,

   partac01 c

 where a.center_cd = 'AA0001'

  and a.asset_div like 'TT0002%' 

group by a.asset_div, a.partacc_cd, a.partptr_cd,

     b.partacc_cd, b.partptr_cd,

     c.partac_nm

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

이 결과가 원하는 것인지 데이터를 검증 해 보세요...;
결과는 같지만 집계함수 처리 시 Null에 대한 처리를 SUM안에서 row마다 하는 것과 SUM후 최종적으로 한번만 하는 것은 성능 상 미묘한 차이가 있습니다...참고하세요...;

SELECT
    CASE a.asset_div
        WHEN 'TT0001' THEN '상품'
        WHEN 'TT0002' THEN '저장품'
    END AS asset_div,
    a.partacc_cd,
    c.partac_nm,
    a.partptr_cd,
    d.partpr_nm,
    SUM(a.stock_cnt) stock_cnt,
    ISNULL(SUM(b.in_cnt),0) in_cnt,
    ISNULL(SUM(b.out_cnt),0) out_cnt
FROM    matmst01 a
    LEFT OUTER JOIN
        inoutx01 b
     ON a.center_cd = b.center_cd
    INNER JOIN
        partac01 c
     ON a.partacc_cd = c.partac_cd
    INNER JOIN
        partpr01 d
     ON a.partptr_cd = c.partpr_cd   
WHERE a.center_cd = 'AA0001'
  AND a.asset_div LIKE 'TT0002%'
GROUP BY
    a.asset_div, a.partacc_cd, c.partac_nm,
    a.partptr_cd, d.partpr_nm

건승하시길...수고하세요~~

성시현(finecomp)님이 2007-07-05 17:24에 작성한 댓글입니다.

안녕하세요. 답변감사드립니다.

그러나 답변대로 쿼리를 날렸더니, 몇부분에 오류가 있어 수정을 하고 날려보니.


서버:메세지 8153,수준: 0,상태 1,줄 1

경고: 집계 또는 다른 SET 연산에 의해 Null 값이 제거되었습니다.


이라는 메세지가 나오네요.. 

그래도 친절한 조언 정말 감사드립니다 ^^;

질문..님이 2007-07-05 17:27에 작성한 댓글입니다. Edit

제가 오라클쪽의 엔지니어라 미처 Test를 못하고 올린 점 사과드립니다...;

당장 SQL Server 2005로 Test용 다운로드 받아 설치 해야 겠군요...^^;

성시현(finecomp)님이 2007-07-05 17:44에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
3618외부 서버에 특정 테이블 오픈하는 방법 [1]
김지은
2007-07-06
2347
3617MSSQL에서 데이터 파일 크기 관련 질문 입니다. [1]
이승현
2007-07-06
2442
3616SP(저장 프로시저) 수정 일자 알 수 있는 방법 [1]
나영욱
2007-07-06
4707
3614쿼리 질문입니다. [3]
질문..
2007-07-05
3283
3613[참고] SQL 2005의 TABLE,COLUMN COMMNET(DESCRIPTION) [1]
호빵맨
2007-07-05
3089
3612DB접속이 안됩니다. 도와주세요.
초짜
2007-07-05
3146
3611Toad For Sql Server 쓰고 있습니다. 레코드 수정 안되는 문제..
초보
2007-07-05
2427
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다