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 39932 게시물 읽기
No. 39932
고정으로 나오게
작성자
도와주세요.
작성일
2012-12-18 12:28ⓒ
2012-12-18 12:29ⓜ
조회수
6,451
날짜 언어 장치1 장치2
2012-12-01 한국어 1 0
2012-12-02 영어 0 1
2012-12-02 중국어 1 2

 

위의 이런 형태에서 아래형태로 바꾸려면 어떻게 해야할까요?

날짜 언어 장치1 장치2
2012-12-01 한국어 1 0
  영어 0 0
  중국어 0 0
  일본어 0 0
2012-12-02 한국어 0 0
  영어 0 1
  중국어 1 2
  일본어 0 0

언어가 다표시되고 장치1,  장치2의 건수만 표시되도록하게 하고싶습니다.

도와주세요 ~

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


1. 우선 언어코드 테이블이 필요하며, (LAN 테이블)
2. 보고자하는 형식의 DATASET을 만듭니다. (A 테이블)
3. 이후 내역테이블(TAB)와 아우터 조인합니다.


-- 내역테이블에 있는 날짜만 나오는 기준
WITH TAB AS
(
    SELECT '2012-12-01' DT,  '한국어' LAN, 1 CNT1, 0 CNT2 FROM DUAL UNION ALL
    SELECT '2012-12-02' DT,  '영어'   LAN, 0 CNT1, 1 CNT2 FROM DUAL UNION ALL
    SELECT '2012-12-02' DT,  '중국어' LAN, 1 CNT1, 2 CNT2 FROM DUAL
), LAN AS
(
    SELECT '한국어' LAN FROM DUAL UNION ALL
    SELECT '영어'   LAN FROM DUAL UNION ALL
    SELECT '일본어' LAN FROM DUAL UNION ALL
    SELECT '중국어' LAN FROM DUAL
)
SELECT  A.DT
      , A.LAN
      , NVL(B.CNT1, 0)
      , NVL(B.CNT2, 0)
FROM   (SELECT  DT, LAN
         FROM   LAN,
                (SELECT DISTINCT DT FROM TAB)
       ) A,
       TAB B
WHERE  A.DT   = B.DT(+)
  AND  A.LAN  = B.LAN(+)
ORDER  BY A.DT
    
    

-- 내역테이블의 날짜범위가 다 나오는 기준
WITH TAB AS
(
    SELECT '2012-12-01' DT,  '한국어' LAN, 1 CNT1, 0 CNT2 FROM DUAL UNION ALL
    SELECT '2012-12-02' DT,  '영어'   LAN, 0 CNT1, 1 CNT2 FROM DUAL UNION ALL
    SELECT '2012-12-02' DT,  '중국어' LAN, 1 CNT1, 2 CNT2 FROM DUAL UNION ALL
    SELECT '2012-12-04' DT,  '중국어' LAN, 1 CNT1, 2 CNT2 FROM DUAL
), LAN AS
(
    SELECT '한국어' LAN FROM DUAL UNION ALL
    SELECT '영어'   LAN FROM DUAL UNION ALL
    SELECT '일본어' LAN FROM DUAL UNION ALL
    SELECT '중국어' LAN FROM DUAL
)
SELECT  A.DT
      , A.LAN
      , NVL(B.CNT1, 0)
      , NVL(B.CNT2, 0)
FROM   (SELECT  DT, LAN
         FROM   LAN,
                (SELECT TO_CHAR(TO_DATE( (SELECT MIN(DT) FROM TAB) ,'YYYY-MM-DD') + LEVEL -1, 'YYYY-MM-DD') DT
                   FROM DUAL
                CONNECT BY LEVEL <= (SELECT MAX(TO_DATE(DT,'YYYY-MM-DD')) - MIN(TO_DATE(DT,'YYYY-MM-DD'))+1 FROM TAB) )
       ) A,
       TAB B
WHERE  A.DT   = B.DT(+)
  AND  A.LAN  = B.LAN(+)
ORDER  BY A.DT
     
    

DOL님이 2012-12-18 16:56에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
39938MERGE 관련하여 질문 드립니다. [1]
이민욱
2012-12-21
5837
39936통계 산출 쿼리 마무리가 안됩니다. [1]
노근배
2012-12-20
7506
39933도움부탁드립니다..ㅠㅠ 쿼리검증질문 [2]
초보
2012-12-18
5490
39932고정으로 나오게 [1]
도와주세요.
2012-12-18
6451
399312개의 VIEW에서 조회내용뽑아내기
희희
2012-12-18
5400
39930통계구할려고 하는데 도와주세요
디비초보
2012-12-17
4871
39928[질문] 소계 합계 문의 드립니다. [1]
안동석
2012-12-15
5717
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.024초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다