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
운영게시판
최근게시물
Oracle Q&A 40186 게시물 읽기
No. 40186
모르는 게 많아 또 질문합니다.
작성자
황인준(초콜릿바나나)
작성일
2013-07-08 15:06ⓒ
2013-07-08 15:07ⓜ
조회수
6,741

SELECT CUST_CODE
            , DECODE(GROUPING(DECODE(ITEM_TYPE, '800', '원단' , '상자')), 1, '합계'
                                               , DECODE(ITEM_TYPE, '800', '원단' , '상자')) ITEM_TYPE, SUM(M2) M2, SUM(AMT) AMT
    FROM V_SALE
    WHERE IN_OUT_DD BETWEEN '2013-01-01' AND '2013-05-31'
    GROUP BY CUST_CODE
                  , ROLLUP(DECODE(ITEM_TYPE, '800', '원단' , '상자'));

아까 아린님이 가르쳐주신대로 쿼리를 작성했습니다.

거래처코드 아이템타입 M2 AMT
07 상자 10 100
07 원단 20 250
07 합계 30 350
01 상자 30 200
01 합계 30 200

이런식으로 출력이 되고 있구요.

이 것을

거래처 원단                 상자                 합계                
         M2      AMT  M2       AMT M2       AMT
07 20 250 10 100 30 350
01 0 0 30 200 30 200
      .      
      .      
      .      

이런 형태로 출력하고 싶습니다. 원단 M2, AMT 값이 없을 경우 0으로 표현하고 싶구요.

그리고 가능하다면

  M2 AMT M2 AMT M2 AMT
07 20  (66%) 250 (71%) 10 (33%) 100 (29%) 30 350
01 0    ( 0% ) 0      ( 0 %) 30 (100%) 200 (100%) 30 200

원단, 상자가 합계에서 차지하는 퍼센트를 표시하는 방법이 있다면 알려주시면 정말 감사할 것 같습니다.

 

이 글에 대한 댓글이 총 6건 있습니다.
SELECT cust_code
     , m2_one
      ||' ('||TRUNC( m2_one /  m2_hap * 100)||'%)'  m2_one_rat
     , amt_one
      ||' ('||TRUNC(amt_one / amt_hap * 100)||'%)' amt_one_rat
     , m2_box
      ||' ('||TRUNC( m2_box /  m2_hap * 100)||'%)'  mw_box_rat
     , amt_box
      ||' ('||TRUNC(amt_box / amt_hap * 100)||'%)' amt_box_rat
     , m2_hap
     , amt_hap
  FROM (SELECT cust_code
             , NVL(SUM(CASE WHEN item_type  = '800'
                            THEN  m2 END),0)  m2_one
             , NVL(SUM(CASE WHEN item_type  = '800'
                            THEN amt END),0) amt_one
             , NVL(SUM(CASE WHEN item_type != '800'
                            THEN  m2 END),0)  m2_box
             , NVL(SUM(CASE WHEN item_type != '800'
                            THEN amt END),0) amt_box
             , NVL(SUM( m2),0)  m2_hap
             , NVL(SUM(amt),0) amt_hap
          FROM t
         WHERE in_out_dd BETWEEN '2013-01-01' AND '2013-05-31' 
         GROUP BY cust_code
        ) 
아린(arin76)님이 2013-07-08 15:57에 작성한 댓글입니다.

아린님 죄송하지만

DBAmaster2000을 이용해 SQL 돌린 다음 엑셀로 저장하려고 하니

ORA-01476: 제수가 0 입니다.

라는 에러가 뜹니다.

제가 해결해보려고 검색해봤는데

분모 값이 0일 경우 뜬다고 합니다.

제가 실력이 미천해서 해결은 못했습니다...

 

그리고 혹시 숫자와 퍼센트를 열 분리를 할 수 있을까요?

자꾸 여쭤봐서 죄송합니다.

황인준(초콜릿바나나)님이 2013-07-08 16:51에 작성한 댓글입니다.
이 댓글은 2013-07-08 17:03에 마지막으로 수정되었습니다.

SELECT 100 / 0 FROM dual 

위와 같이 하면 "제수가 0 입니다." 라는 오류가 나타나는데요.

즉, 합계부분이 0 이기 때문에 나타나는 부분입니다.

그런데, 합계부분이 0 이라는 말은 데이터는 존재하지만  m2, amt 값이 0으로 되어있다는 건데요.

이런 데이터도 있나 보네요..


그럴경우 GROUP BY 밑에 합계부분이 0 인 경우는 제외하는 HAVING 절을 해주시면 될것같네요. 

 

그리고, 숫자와 % 부분 분리는  " || " 부분만 삭제해주시면 됩니다.

 

SELECT cust_code
     , m2_one
     , TRUNC( m2_one /  m2_hap * 100)||'%'  m2_one_rat
     , amt_one
     , TRUNC(amt_one / amt_hap * 100)||'%' amt_one_rat
     , m2_box
     , TRUNC( m2_box /  m2_hap * 100)||'%'  mw_box_rat
     , amt_box
     , TRUNC(amt_box / amt_hap * 100)||'%' amt_box_rat
     , m2_hap
     , amt_hap
  FROM (SELECT cust_code
             , NVL(SUM(CASE WHEN item_type  = '800'
                            THEN  m2 END),0)  m2_one
             , NVL(SUM(CASE WHEN item_type  = '800'
                            THEN amt END),0) amt_one
             , NVL(SUM(CASE WHEN item_type != '800'
                            THEN  m2 END),0)  m2_box
             , NVL(SUM(CASE WHEN item_type != '800'
                            THEN amt END),0) amt_box
             , NVL(SUM( m2),0)  m2_hap
             , NVL(SUM(amt),0) amt_hap
          FROM t
         WHERE in_out_dd BETWEEN '2013-01-01' AND '2013-05-31' 
         GROUP BY cust_code
        HAVING NVL(SUM( m2),0) > 0
           AND NVL(SUM(amt),0) > 0
        ) 
아린(arin76)님이 2013-07-08 17:14에 작성한 댓글입니다.
이 댓글은 2013-07-08 17:15에 마지막으로 수정되었습니다.

정말 감사합니다. 아린님 덕분에 며칠 고민하던 게 해결되었습니다.

아린님이 해주시는 거 보고 정말 제가 초보구나 알게 되었습니다.

황인준(초콜릿바나나)님이 2013-07-08 17:24에 작성한 댓글입니다.

"0" 인 데이터도 나와야 한다면,

DECODE문으로 제수부분이 "0" 일경우, "0" 으로 처리하는 방법도 있습니다.


 DECODE( m2_hap, 0, 0, TRUNC( m2_one /  m2_hap * 100))

아린(arin76)님이 2013-07-08 17:24에 작성한 댓글입니다.

아... 그렇군요.

마지막까지 신경 써주셔서 감사합니다.

황인준(초콜릿바나나)님이 2013-07-09 09:30에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40190[질문] 전각문자의 lpad, rpad 문제 [1]
DIDKUDUS
2013-07-12
6638
40189TO_TIMESTAMP_TZ 에 KST는 지원이 안되나요?
2013-07-11
6723
40188작년 같은주 찾기 방법 [3]
차병은
2013-07-10
6273
40186모르는 게 많아 또 질문합니다. [6]
황인준
2013-07-08
6741
40185오라클 sequence 질문 [1]
천정대
2013-07-08
7074
40184안녕하십니까? 모르는게 있어 이렇게 글 남깁니다. [5]
황인준
2013-07-08
6953
40183Squirrel SQL Client 3.5.0 오라클 SELECT결과 한글문제
이명훈
2013-07-06
7008
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다