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 39043 게시물 읽기
No. 39043
최근 6개월 동안 계속 실적이 있는 껀만 집계
작성자
taiji
작성일
2011-11-04 10:21
조회수
4,961

안녕하세요~

select '20110601'as ymd  ,      'AA'   as item     ,            1 as qty from dual union all
select '20110801'  ,      'BB'       ,           11                      from dual union all
select '20110701'  ,      'AA'       ,            2                      from dual union all
select '20110901'  ,      'BB'       ,            1                      from dual union all
select '20110801'  ,      'AA'       ,            3                      from dual union all
select '20110901'  ,      'AA'       ,            4                      from dual union all
select '20111001'  ,      'AA'       ,            5                      from dual union all
select '20111102'  ,      'AA'       ,            6                      from dual

 

실적이 이렇게 있을때   최근 6개월 동안 매월 실적이 있는 item 만 뽑아서 행으로 나타 낼수 있을까요?

 

AA    1  2 3 4 5 6

 

날짜로 decode 로 해서 감싸서 sum으로 해서 컬럼 6개가 다 0 보다 크다 이렇게 할려니 껀수가 많아서  답이 없네요

 

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

 

 

6개월치 데이터가  대량으로 누적되어 있다면 성능 문제는 감수하셔야 합니다.

별도로 요약 테이블을 만들거나 MVIEW를 쓰거나 하는 방법을 쓰시는 수 밖에는 없습니다.

대부분 이런 통계 데이터는 보는 사람이 많지 않으므로 파티셔닝이나 클러스터링팩터로 어느 정도 성능 문제는 해결이 가능합니다. 그렇지 않다면 단순히 인덱스를 타는 방식으론느 오히려 더 느려지거나, 혹은 전체 스캔으로 갈경우 엄청난 부하를 줄 수 있습니다.

 

(아마 YMD 컬럼을 파티션 키로 하여 월 단위 RANGE 파티셔닝이 되어 있을 거라고 보구요.)

 

WITH temp AS

        (SELECT '20110601' AS ymd, 'AA' AS item, 1 AS qty FROM DUAL

         UNION ALL

         SELECT '20110801', 'BB', 11 FROM DUAL

         UNION ALL

         SELECT '20110701', 'AA', 2 FROM DUAL

         UNION ALL

         SELECT '20110901', 'BB', 1 FROM DUAL

         UNION ALL

         SELECT '20110801', 'AA', 3 FROM DUAL

         UNION ALL

         SELECT '20110901', 'AA', 4 FROM DUAL

         UNION ALL

         SELECT '20111001', 'AA', 5 FROM DUAL

         UNION ALL

         SELECT '20111102', 'AA', 6 FROM DUAL)

SELECT   item

        ,MIN (DECODE (no, 1, qty))

        ,MIN (DECODE (no, 2, qty))

        ,MIN (DECODE (no, 3, qty))

        ,MIN (DECODE (no, 4, qty))

        ,MIN (DECODE (no, 5, qty))

    FROM (SELECT ymd, item, ROW_NUMBER () OVER (PARTITION BY item ORDER BY ymd) no, qty

            FROM temp

           WHERE ymd >= TO_CHAR (ADD_MONTHS (SYSDATE, -6), 'YYYYMMDD') AND qty > 0)

 

아무거나님이 2011-11-04 11:18에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
39046DB2의 PL을 오라클 PL로 바꾸기
양귀석
2011-11-04
4661
39045PL관련 질문 [2]
양귀석
2011-11-04
9459
39044oracle 11g connection 종료 방법이 있을까요 ? [3]
궁금이
2011-11-04
4507
39043최근 6개월 동안 계속 실적이 있는 껀만 집계 [1]
taiji
2011-11-04
4961
3904211g에서 9i로 import하려고 9i에서 11g접속 후 exorpt시 안됨 [4]
조국
2011-11-04
8716
39041중복된 데이터중에 각 한건씩만 가져오고 싶습니다. [2]
allan
2011-11-03
4931
39040중복기간 일수 조회 질문입니다. [3]
deicide
2011-11-03
5351
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.016초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다