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 38917 게시물 읽기
No. 38917
가변적인 세로 데이타를 가로로 변환?
작성자
노랑새
작성일
2011-09-27 15:00
조회수
6,646

<예제1>

대분류 소분류 그룹코드 개별코드 발생일자 수량
01 0101 A100 A100-1 20110101 1
01 0101 A100 A100-2 20110101 1
02 0201 B100 B100 20110102 2
02 0202 B200 B200 20110103 1
03 0301 B300 B300 20110104 1
03 0302 B400 B400 20110104 1
03 0301 B300 B300 20110104 1

 

<예제2>

대분류 소분류 그룹코드 개별코드 01월 01일 01월 02일 01월 03일 01월 04일 ……
01 0101 A100 A100-1 1        
01 0101 A100 A100-2 1        
02 0201 B100 B100   2      
02 0202 B200 B200     1    
03 0301 B300 B300       2  
03 0302 B400 B400       1  
. . . .          
. . . .          
. . . .          
. . . .          

예제1의 원 데이타를 예제2로 변환하여 보여주려고 합니다.

대분류, 소분류, 개별코드는 사용자마다 틀립니다.

발생일자또한 조회시 입력받은 날짜로 해당 발생일자를 조회하게 됩니다.

개별코드는 발생일자별로 수량을 SUM해야하며..

발생일자를 사용자가 한달이상 입력했을 경우에는(예: 1/1 ~ 2/28) 컬럼의 수가 너무 많이 늘어나게 되어

한달로 기간을 제한하려합니다.

 

가로, 세로, PIVOT등으로 조회해서 봐도 어려워서..도움을 요청하오니 부디..도와주세요~!!

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

WITH t AS
(
SELECT '01' gb1, '0101' gb2, 'A100' gb3, 'A100-1' gb4, '20110101' dt, 1 cnt FROM dual
UNION ALL SELECT '01', '0101', 'A100', 'A100-2', '20110101', 1 FROM dual
UNION ALL SELECT '02', '0201', 'B100', 'B100', '20110102', 2 FROM dual
UNION ALL SELECT '02', '0202', 'B200', 'B200', '20110103', 1 FROM dual
UNION ALL SELECT '03', '0301', 'B300', 'B300', '20110104', 1 FROM dual
UNION ALL SELECT '03', '0302', 'B400', 'B400', '20110104', 1 FROM dual
UNION ALL SELECT '03', '0301', 'B300', 'B300', '20110104', 1 FROM dual
)
SELECT gb1, gb2, gb3, gb4
     , SUM(DECODE(SUBSTR(dt, 7), '01', cnt)) "01"
     , SUM(DECODE(SUBSTR(dt, 7), '02', cnt)) "02"
     , SUM(DECODE(SUBSTR(dt, 7), '03', cnt)) "03"
     , SUM(DECODE(SUBSTR(dt, 7), '04', cnt)) "04"
     , SUM(DECODE(SUBSTR(dt, 7), '05', cnt)) "05"
     , SUM(DECODE(SUBSTR(dt, 7), '06', cnt)) "06"
     , SUM(DECODE(SUBSTR(dt, 7), '07', cnt)) "07"
     , SUM(DECODE(SUBSTR(dt, 7), '08', cnt)) "08"
     , SUM(DECODE(SUBSTR(dt, 7), '09', cnt)) "09"
     , SUM(DECODE(SUBSTR(dt, 7), '10', cnt)) "10"
     , SUM(DECODE(SUBSTR(dt, 7), '11', cnt)) "11"
     , SUM(DECODE(SUBSTR(dt, 7), '12', cnt)) "12"
     , SUM(DECODE(SUBSTR(dt, 7), '13', cnt)) "13"
     , SUM(DECODE(SUBSTR(dt, 7), '14', cnt)) "14"
     , SUM(DECODE(SUBSTR(dt, 7), '15', cnt)) "15"
     , SUM(DECODE(SUBSTR(dt, 7), '16', cnt)) "16"
     , SUM(DECODE(SUBSTR(dt, 7), '17', cnt)) "17"
     , SUM(DECODE(SUBSTR(dt, 7), '18', cnt)) "18"
     , SUM(DECODE(SUBSTR(dt, 7), '19', cnt)) "19"
     , SUM(DECODE(SUBSTR(dt, 7), '20', cnt)) "20"
     , SUM(DECODE(SUBSTR(dt, 7), '21', cnt)) "21"
     , SUM(DECODE(SUBSTR(dt, 7), '22', cnt)) "22"
     , SUM(DECODE(SUBSTR(dt, 7), '23', cnt)) "23"
     , SUM(DECODE(SUBSTR(dt, 7), '24', cnt)) "24"
     , SUM(DECODE(SUBSTR(dt, 7), '25', cnt)) "25"
     , SUM(DECODE(SUBSTR(dt, 7), '26', cnt)) "26"
     , SUM(DECODE(SUBSTR(dt, 7), '27', cnt)) "27"
     , SUM(DECODE(SUBSTR(dt, 7), '28', cnt)) "28"
     , SUM(DECODE(SUBSTR(dt, 7), '29', cnt)) "29"
     , SUM(DECODE(SUBSTR(dt, 7), '30', cnt)) "30"
     , SUM(DECODE(SUBSTR(dt, 7), '31', cnt)) "31"
  FROM t
 WHERE dt LIKE '201101' || '%'
 GROUP BY gb1, gb2, gb3, gb4
 ORDER BY gb1, gb2, gb3, gb4
;

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

아~드디어 댓글이 달렸구나..마농님!

정말 감사합니다...

어제 나름 해봤는데..

SELECT LCLS
     , SCLS
     , CD
     , MAX(HNM) HNM
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '01', (QTY), 0)) DY1
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '02', (QTY), 0)) DY2
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '03', (QTY), 0)) DY3
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '04', (QTY), 0)) DY4
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '05', (QTY), 0)) DY5
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '06', (QTY), 0)) DY6
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '07', (QTY), 0)) DY7
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '08', (QTY), 0)) DY8
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '09', (QTY), 0)) DY9
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '10', (QTY), 0)) DY10
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '11', (QTY), 0)) DY11
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '12', (QTY), 0)) DY12
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '13', (QTY), 0)) DY13
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '14', (QTY), 0)) DY14
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '15', (QTY), 0)) DY15
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '16', (QTY), 0)) DY16
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '17', (QTY), 0)) DY17
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '18', (QTY), 0)) DY18
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '19', (QTY), 0)) DY19
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '20', (QTY), 0)) DY20
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '21', (QTY), 0)) DY21
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '22', (QTY), 0)) DY22
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '23', (QTY), 0)) DY23
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '24', (QTY), 0)) DY24
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '25', (QTY), 0)) DY25
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '26', (QTY), 0)) DY26
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '27', (QTY), 0)) DY27
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '28', (QTY), 0)) DY28
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '29', (QTY), 0)) DY29
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '30', (QTY), 0)) DY30
     , MAX(DECODE(SUBSTR(DR_DATE, 7, 2), '31', (QTY), 0)) DY31
FROM (
        SELECT MAX(LCLS.NM)              LCLS
             , ORD.SCLS                  SCLS_CD
             , MAX(SCLS.NM)              SCLS
            , ORD.CD                                 
           , MAX(SU.HNM)               HNM          
           , ORD.DR_DATE                            
           , SUM(ORD.QTY) QTY                       
    FROM AA_ORDER ORD
         INNER JOIN AA_AND AD
                 ON AD.H_CD = ORD.H_CD
                AND AD.T_NO = ORD.T_NO
         INNER JOIN AA_PT ACPT
                 ON ACPT.H_CD   = AD.H_CD
                AND ACPT.T_NO   = AD.T_NO
          INNER JOIN AA_CODE SU
                 ON SU.H_CD = ORD.H_CD
                AND SU.CD   = ORD.CD
    LEFT OUTER JOIN CC_COD LCLS
                 ON LCLS.CLSF = '0001'
                AND LCLS.TY      = '00'
                AND LCLS.CM      = ORD.LCLS
    LEFT OUTER JOIN CC_COD SCLS
                 ON SCLS.CLSF = '0001'
                AND SCLS.TY      = '01'
                AND SCLS.CM      = ORD.SCLS
  WHERE ORD.H_CD = '1111'
    AND ORD.P_NO = '12345678'
  GROUP BY ORD.LCLS
         , ORD.SCLS
         , ORD.CD
         , ORD.DR_DATE    )
GROUP BY LCLS
       , SCLS
       , CD
ORDER BY LCLS
       , SCLS
       , CD

 

비슷하게 잘 한것 같아요..뿌듯..^^

마농님..너무너무~~ 감사합니다...

사랑넷에서 엄청 많이 도움 받고 있는 사람중에 한명이에요..

모르고 막힌다 싶으면 어김없이 찾아온답니다...하하하

 

수고하세요...

 

노랑새님이 2011-09-29 17:00에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
38920[급질] 한 서버에 DB가 2개일경우 recover [4]
임서희
2011-09-28
5269
38919캐릭터셋 질문 급급 부탁해요 [1]
상큼이
2011-09-28
4411
38918Import 시 레코드 데이타 Overwrite 방법이 없을까요? [1]
김지현
2011-09-28
4439
38917가변적인 세로 데이타를 가로로 변환? [2]
노랑새
2011-09-27
6646
38916쿼리 성능 관련 질문입니다. [2]
조동건
2011-09-27
4010
38915materialized view 생성이 안될때 [6]
박주영
2011-09-27
5093
38914ora-00604,ora-00001 테이블 생성시
정병화
2011-09-27
4575
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.026초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다