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 6355 게시물 읽기
No. 6355
쿼리문을 짜야되는데요 좋은 방법있는지 부탁드려요
작성자
난해해
작성일
2012-04-03 20:01ⓒ
2012-04-04 15:50ⓜ
조회수
7,319

(색을 좀더 표시해서 쉽게 이해하도록 수정하였습니다. 2012-04-04 15:40)

안녕하세요

스토어드 프로시져 쿼리좀 짜는데요 참 안되네요

해서 여쭤보겠는데요.

 

각 월별로 구분_ITEM3에  1과 2로 분리되는 항목의 데이터가 있습니다. 노란색처럼요.

 데이터 테이블 구조는 아래와 같고요.

D_UID 구분_ZONE 구분_ITEM1 구분_ITEM2 구분_ITEM3 CAL_YEAR C_JAN C_FEB C_MAR C_APR C_MAY C_JUN C_JUL C_AUG C_SEP C_OCT C_NOV C_DEC
3 1 1 NULL 1 2012 11.9 12.9 13.8 15.3 23.3 29.3 74.8 84.9 101 120.4 125.4 113.8
6 1 2 NULL 1 2012 18 8 5 34 23 13 18 20 13 14 13 25
7 1 3 NULL 1 2012 44 25 23 13 9 18.1 22 31 20 17 50 70
8 1 4 NULL 1 2012 27.7 30 6 3 19 24 11.5 26.3 11.3 5.8 4.1 4.7
9 1 5 NULL 1 2012 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4 1.4
10 1 6 NULL 1 2012 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4
11 1 7 NULL 1 2012 2 4 1 4 5 3 6 10 4 8 4 6
12 1 8 1 1 2012 0 0 3 1 3 4 2 3 7 8 5 4
13 1 8 2 1 2012 1 3 2 3 4 4 3 2 5 3 2 5
14 1 8 3 1 2012 2 0 3 0 4 3 2 1 0 2 1 5
17 1 1 NULL 2 2012 15.1 9.93 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

 

이것을 아래와 같이 구분아이템 1,2,3을 조합하여 구분조합코드로 유니크하게 하고

(물론 앞에 유니크한 시퀀스ID(자동증가 ID)가 있지만요.=D_UID 컬럼)

구분아이템1,구분아이템2,구분아이템3 순서인데..구분아이템3은 값이 1,2순으로 정렬합니다.

 

문제는 12월끝에 누적과 합계를 추가해야되는데요.

합계는... 단순히 해당 1월~12월까지의 SUM(합계)를 하는것이지만,

누적은... 예를들어 노란색의 데이터만 보면( 구분아이템1의 데이터가 1에 대해서만 설명드리자면),

                구분아이템3에서 값2에 해당하는 월별 값이 있는 최종 값.

                즉,2월까지에 해당하는 합계가 각각 누적컬럼에 값1과 값2에 들어가야됩니다.

 

 

좀 이해하기 힘들수도 있겠는데요.

쉽게 말씀드리면, 다시 밑에 표를 봐주세요.

밑에 노란색에서 누적 컬럼의 값1과 값2는 각각 노란색 구분 아이템3의 데이터2(빨간색표시)에 해당하는 1월과 2월의 15.1과 9.93이라는 NULL이 없는( 데이터가 있는 최대 컬럼의 값)까지의 합계를 말합니다.

누적 값1 = 11.9 + 12.9

누적 값2 = 15.1 + 9.93

이 되는것이죠.

 

마찬가지로 구분 아이템1에서 2에 해당하는 누적 컬럼 값3과 값4를 구하는것을 예를들겠습니다.

누적컬럼의 값3과 값4를 구해야되는데요.

누적컬럼의 값3 = 구분 아이템1에서  데이터가  2 이면서,  구분아이템3의 데이터가 2인, 1월부터 12월까지의 데이터들중에 NULL이 아닌 최대 월(데이터가 있는 최대 월)의 구분아이템3의 1값의  누계.

                                 3월까지는 15라는 데이터가 있고 4월부터는 NULL이니까 3월까지의 합계입니다.  즉  18 + 8 + 5 가 되는거죠.

 

누적컬럼의 값4 = 구분 아이템1에서  데이터가  2 이면서,  구분아이템3의 데이터가 2인, 1월부터 12월까지의 데이터들중에 NULL이 아닌 최대 월(데이터가 있는 최대 월)의 구분아이템3의 1값의 누계.

                                 3월까지는 15라는 데이터가 있고 4월부터는 NULL이니까 3월까지의 합계입니다.  즉  19 +10 +15 가 되는거죠.

 

누적 값 5 = 44+25

누적 값 6 =  7 +8

...............

 

저렇게 구분아이템3의 2값에 해당하는 데이터가 있는 월까지의 합계,평균등을 구하는것인데요.

 

구분조합코드 구분_ZONE 구분_ITEM1 구분_ITEM2 구분_ITEM3 CAL_YEAR C_JAN C_FEB C_MAR C_APR C_MAY C_JUN C_JUL C_AUG C_SEP C_OCT C_NOV C_DEC 누적 합계
101 1 1 NULL 1 2012 11.9 12.9 13.8 15.3 23.3 29.3 74.8 84.9 101 120.4 125.4 113.8  값1  
102 1 1 NULL 2 2012 15.1 9.93 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL  값2  
201 1 2 NULL 1 2012 18 8 5 34 23 13 18 20 13 14 13 25  값3  
202 1 2 NULL 2 2012 19 10 15 NULL NULL NULL NULL NULL NULL NULL NULL NULL  값4  
301 1 3 NULL 1 2012 44 25 23 13 9 18.1 22 31 20 17 50 70  값5  
302 1 3 NULL 2 2012 7 8 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL  값6  
401 1 4 NULL 1 2012 27.7 30 6 3 19 24 11.5 26.3 11.3 5.8 4.1 4.7  값7  
402 1 4 NULL 2 2012 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL  값8  

 

어떻게하면 누적 값1,값2,....를 쿼리로 쉽게 성능 고려해서 짤 수있을까요.

많은 도움 부탁드립니다.

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

 이 질문 이해되시는 분?

우욱님이 2012-04-04 14:57에 작성한 댓글입니다. Edit

안녕하세요. 우욱님.

 

좀더 이해하기 쉽게..데이터에 색 표시했습니다.

저장프로시져로 짜서 현재 데이터가 표 형태로 결과가 나오게 구현했고요.

그 모습은 웹에 그대로 반영할 모습이라서요.

그 표 형태의 데이터에서 저도 누적값 구하는게..컬럼까지 찾고하는건데

힘들게..쿼리로 뺑뺑이 돌며 하면 가능은 하겠는데

복잡해지고 지저분해지고 성능도 고려해야되서요.

 

혹시 좋은 아이디어와 방법으로 도움을 주시면 감사합니다.

난해해님이 2012-04-04 15:53에 작성한 댓글입니다. Edit

도움이 될지는 모르겠는데..

SELECT *
  , CASE WHEN Cnt >= 1 THEN C_JAN ELSE 0 END
  + CASE WHEN Cnt >= 2 THEN C_FEB ELSE 0 END
  + CASE WHEN Cnt >= 3 THEN C_MAR ELSE 0 END
  + CASE WHEN Cnt >= 4 THEN C_APR ELSE 0 END
  + CASE WHEN Cnt >= 5 THEN C_MAY ELSE 0 END
  + CASE WHEN Cnt >= 6 THEN C_JUN ELSE 0 END
  + CASE WHEN Cnt >= 7 THEN C_JUL ELSE 0 END
  + CASE WHEN Cnt >= 8 THEN C_AUG ELSE 0 END
  + CASE WHEN Cnt >= 9 THEN C_SEP ELSE 0 END
  + CASE WHEN Cnt >= 10 THEN C_OCT ELSE 0 END
  + CASE WHEN Cnt >= 11 THEN C_NOV ELSE 0 END
  + CASE WHEN Cnt >= 12 THEN C_DEC ELSE 0 END AS 누적값
   FROM TABLES a
  JOIN (select Item1, ITEM2
     , CASE WHEN ISNULL(C_JAN,0) = 0 THEN 0 ELSE 1 END
     + CASE WHEN ISNULL(C_FEB,0) = 0 THEN 0 ELSE 1 END
     + CASE WHEN ISNULL(C_MAR,0) = 0 THEN 0 ELSE 1 END
     + CASE WHEN ISNULL(C_APR,0) = 0 THEN 0 ELSE 1 END
     + CASE WHEN ISNULL(C_MAY,0) = 0 THEN 0 ELSE 1 END
     + CASE WHEN ISNULL(C_JUN,0) = 0 THEN 0 ELSE 1 END
     + CASE WHEN ISNULL(C_JUL,0) = 0 THEN 0 ELSE 1 END
     + CASE WHEN ISNULL(C_AUG,0) = 0 THEN 0 ELSE 1 END
     + CASE WHEN ISNULL(C_SEP,0) = 0 THEN 0 ELSE 1 END
     + CASE WHEN ISNULL(C_OCT,0) = 0 THEN 0 ELSE 1 END
     + CASE WHEN ISNULL(C_NOV,0) = 0 THEN 0 ELSE 1 END
     + CASE WHEN ISNULL(C_DEC,0) = 0 THEN 0 ELSE 1 END AS Cnt
     FROM TABLES
    WHERE ITEM3 = 2 ) b ON a.ITEM1 = b.ITEM1 ON a.ITEM2 = b.ITEM2

이런식으로 하면 어떨지..

ITEM2는 NULL값이 있어서 조인시 주의해야 할것 같고 ...

착한넘(agoodman99)님이 2012-04-06 17:57에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
6358데이터타입 변경 (varchar -> text) 에 대해서 [1]
js
2012-04-06
6735
6357소유자 dbo와 db_owner 차이점에 대해 문의합니다 [1]
초보자
2012-04-04
8736
6356or 연산을 지원하는 집계함수가 필요합니다. [3]
조중규
2012-04-04
6890
6355쿼리문을 짜야되는데요 좋은 방법있는지 부탁드려요 [3]
난해해
2012-04-03
7319
6354sql2008에서 이미지 화일 db에 저장하는 방법 sql문부탁
김길동
2012-04-01
6513
6353반각문자들로 구성된 데이터 사이에 전각문자가 존재할 경우 추출 [2]
김종문
2012-03-29
9924
6351일자별 누계 어떻게 해야 하나요? [7]
이중희
2012-03-27
8787
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다