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 38434 게시물 읽기
No. 38434
기간별 집계 쿼리 질문 드립니다.
작성자
내마음벌집
작성일
2011-03-12 00:09ⓒ
2011-03-12 12:03ⓜ
조회수
5,654

질문 드립니다.

아래와 같은 데이터 집합이 있습니다.

              이름                       판매일                               수량                        금액    

-----------------------------------------------------------------------------------------------------------------------------------

            A1                         2001-12-31                          4                          1,000

            A2                         2008-01-21                          2                           2,000

            A1                         2010-02-18                          1                           1,500

            A2                         2011-01-21                          2                           2,000

            A1                         2009-10-21                          5                           1,000

            A1                         2008-08-21                          1                           3,000

----------------------------------------------------------------------------------------------------------------------------------

위 집합을 아래와 같이 만들고 싶습니다.

    이름, 최근판매일자,최근판메금액, Max판매금액,Max판매금액일자,Min판매금액, Min판매금액일자,과거 1년간금액합계/1년간 수량,과거  3년간 금액합계 / 3년간 수량

 

현재 여러 테이블들을 연결하여 위와 같은 형태의 데이터 집합까지는 만들어 냈는데  저 집합을 한번에 원하는 집계 데이터로 만들고 싶습니다.

고수님들의 답변 부탁 드립니다.

감사합니다.

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

WITH 테이블 AS
(
SELECT 'A1' 이름, '2001-12-31' 판매일, 4 수량, 1000 금액 FROM dual
UNION ALL SELECT 'A2', '2008-01-21', 2, 2000 FROM dual
UNION ALL SELECT 'A1', '2010-02-18', 1, 1500 FROM dual
UNION ALL SELECT 'A2', '2011-01-21', 2, 2000 FROM dual
UNION ALL SELECT 'A1', '2009-10-21', 5, 1000 FROM dual
UNION ALL SELECT 'A1', '2008-08-21', 1, 3000 FROM dual
)
, 기준 AS
(
SELECT :기준일 기준일
     , TO_CHAR(ADD_MONTHS(TO_DATE(:기준일, 'yyyy-mm-dd'), -12), 'yyyy-mm-dd') 기준일_1년전
     , TO_CHAR(ADD_MONTHS(TO_DATE(:기준일, 'yyyy-mm-dd'), -36), 'yyyy-mm-dd') 기준일_3년전
  FROM dual
)
SELECT 이름
     , MAX(판매일) 최근판매일자
     , MAX(금액) KEEP(DENSE_RANK LAST ORDER BY 판매일) 최근판매금액
     , MAX(금액) Max판매금액
     , MAX(판매일) KEEP(DENSE_RANK LAST ORDER BY 금액) Max판매금액일자
     , MIN(금액) Min판매금액
     , MIN(판매일) KEEP(DENSE_RANK FIRST ORDER BY 금액) Min판매금액일자
     , ROUND
     ( SUM(CASE WHEN 판매일 BETWEEN 기준일_1년전 AND 기준일 THEN 금액 END)
     / SUM(CASE WHEN 판매일 BETWEEN 기준일_1년전 AND 기준일 THEN 수량 END)
     , 2) "과거1년간금액합계/1년간수량"
     , ROUND
     ( SUM(CASE WHEN 판매일 BETWEEN 기준일_3년전 AND 기준일 THEN 금액 END)
     / SUM(CASE WHEN 판매일 BETWEEN 기준일_3년전 AND 기준일 THEN 수량 END)
     , 2) "과거3년간금액합계/3년간수량"
  FROM 테이블
     , 기준
 GROUP BY 이름
;

마농(manon94)님이 2011-03-14 15:27에 작성한 댓글입니다.

마농님 감사합니다.

이런 방법이 있었네요.

근데 질문 하나만 더 추가하겠습니다.

MAX,MIN,LAST 판매금액 및 판매일자에도 범위(일자)를 적용한다면

어떤 방법이 있을까요?

CASE WHEN 으로 하니 자꾸만 NULL 값이 나오네요.

방법 전수 부탁드립니다.

감사합니다.

내마음벌집님이 2011-03-14 17:48에 작성한 댓글입니다. Edit

부분적으로 다른 조건을 줄때는 Select 절에서 Case를 사용하시면 되지만

전체적으로 동일한 조건을 주신다면 Where 절에서 걸러내시면 되지요.

Case 를 사용하셨는데 널이 나온다면?

Case 조건에 맞는 자료가 없어서 널인것이죠. 이상할게 없어 보입니다.

마농(manon94)님이 2011-03-15 08:31에 작성한 댓글입니다.

마농님의 가르침에 감사드립니다.

쿼리문을 다음과 같이 만들었습니다.

WITH 테이블 AS
(
SELECT 'A1' 이름, '2001-12-31' 판매일, 4 수량, 1000 금액 FROM dual
UNION ALL SELECT 'A2', '2008-01-21', 2, 2000 FROM dual
UNION ALL SELECT 'A1', '2010-02-18', 1, 1500 FROM dual
UNION ALL SELECT 'A2', '2011-01-21', 2, 2000 FROM dual
UNION ALL SELECT 'A1', '2009-10-21', 5, 1000 FROM dual
UNION ALL SELECT 'A1', '2008-08-21', 1, 3000 FROM dual
)

SELECT 이름
     , MAX(CASE WHEN 판매일 >= '2010-02-01' AND 판매일 <= '2011-03-01' THEN 판매일 END) 최근판매일자
     , MAX(CASE WHEN 판매일 >= '2010-02-01' AND 판매일 <= '2011-03-01' THEN 금액 END) KEEP(DENSE_RANK LAST ORDER BY 판매일) 최근판매금액
     , MAX(CASE WHEN 판매일 >= '2010-02-01' AND 판매일 <= '2011-03-01' THEN 금액 END) Max판매금액
     , MAX(CASE WHEN 판매일 >= '2010-02-01' AND 판매일 <= '2011-03-01' THEN 판매일 END) KEEP(DENSE_RANK LAST ORDER BY 금액) Max판매금액일자
     , MIN(CASE WHEN 판매일 >= '2010-02-01' AND 판매일 <= '2011-03-01' THEN 금액 END) Min판매금액
     , MIN(CASE WHEN 판매일 >= '2010-02-01' AND 판매일 <= '2011-03-01' THEN 판매일 END) KEEP(DENSE_RANK FIRST ORDER BY 금액) Min판매금액일자
     , ROUND
     ( SUM(CASE WHEN 판매일 BETWEEN TO_CHAR(ADD_MONTHS(SYSDATE,-12),'YYYY-MM-DD') AND TO_CHAR(SYSDATE,'YYYY-MM-DD') THEN 금액 END)
     / SUM(CASE WHEN 판매일 BETWEEN TO_CHAR(ADD_MONTHS(SYSDATE,-12),'YYYY-MM-DD') AND TO_CHAR(SYSDATE,'YYYY-MM-DD') THEN 수량 END)
     , 2) 과거1
     , ROUND
     ( SUM(CASE WHEN 판매일 BETWEEN TO_CHAR(ADD_MONTHS(SYSDATE,-36),'YYYY-MM-DD') AND TO_CHAR(SYSDATE,'YYYY-MM-DD') THEN 금액 END)
     / SUM(CASE WHEN 판매일 BETWEEN TO_CHAR(ADD_MONTHS(SYSDATE,-36),'YYYY-MM-DD') AND TO_CHAR(SYSDATE,'YYYY-MM-DD') THEN 수량 END)
     , 2) 과거3
  FROM 테이블    
 GROUP BY 이름

MAX 판매 금액 일자, MIN 판매 금액 일자가 NULL 값이 나옵니다.

그럼 WHERE 조건에 CASE WHEN문에 해당하는 원하는 기간을 넣는다면

그룹을 세가지로 나누어서 인라인 뷰로 조인 하는 방법 밖에 없을까요?

한번에 원하는 집합으로는 만들 수 없는 건가요?

답변 부탁드릴께요..~

감사합니다.

내마음벌집님이 2011-03-15 09:09에 작성한 댓글입니다. Edit

, MAX(판매일) KEEP(DENSE_RANK FIRST ORDER BY CASE WHEN 판매일 >= '2010-02-01' AND 판매일 <= '2011-03-01' THEN 금액 END DESC NULLS LAST) Max판매금액일자

마농(manon94)님이 2011-03-15 09:19에 작성한 댓글입니다.

우왓~ 너무 감사합니다.

뭔가가 뒷통수를 꽝 하고 때리네요..

역시 쿼리문은 깨달음이 가장 중요한 듯합니다.

정말 감사합니다.

내마음벌집님이 2011-03-15 09:21에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
38437VIEW관련 .. [4]
궁금이
2011-03-14
4089
38436컬럼마다 반복해서 찍고 싶습니다. [1]
ksy833
2011-03-14
3688
38435Oracle의 정의기능, 조작기능, 제어기능이 궁금합니다. [1]
헬프미
2011-03-12
3682
38434기간별 집계 쿼리 질문 드립니다. [6]
내마음벌집
2011-03-12
5654
38432통계 DB Table 설계에 대해 궁굼한점이 있습니다. [1]
컴맹
2011-03-11
3612
38431oracle 테이블 생성중 에러나는데요 [2]
임두환
2011-03-11
5169
38430컬럼 단위 트리거 생성이 가능한가요? [1]
전현욱
2011-03-11
4967
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.022초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다