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 39154 게시물 읽기
No. 39154
left outer join, 날짜 기준 sum, 합계, 총합계
작성자
김기운(kku911)
작성일
2011-12-07 20:36ⓒ
2011-12-08 09:47ⓜ
조회수
8,513

안녕하세요.

단순한 웹 프로그램만을 해서 그런지, 프로그램 한동안 놓고 있어서 그런지.

쿼리가 잘 안되어 질문 올립니다.

 

합계를 구하면서, left outer join 과 같이 "테이블_1" 의 row 는 모두 출력하고,

"테이블_2" 의 내용중 장비 명칭이 동일한 데이터만 날짜 기간 중 날짜별 sum() 을 출력하고자 합니다.

 

그리고, 맨 마지막에 총합계도 구하려고 합니다

 

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

=================

[ 테이블_1 ]

 장비
 a
 b
 c
 d

 

 

=================

 

[ 테이블_2 ]

 날짜  장비  개수


 12/1  a   1
 12/1  a   2
 12/1  b   3
 12/1  b   4


 12/2  c   5
 12/2  c   6

=================

□□□□□□□□□□□□□□□□□□□□□□□□□□
원하는 결과 <<<<<<<<<<<<<<<<<<

-------------------------------------
12/1  a    3
          b    7
          c    0
          d    0
 -------------------------------------
 합         10

-------------------------------------
12/2  a    0
          b    0
         c    11
         d    0
 -------------------------------------
 합        11

-------------------------------------
-------------------------------------
전체합   21
□□□□□□□□□□□□□□□□□□□□□□□□□□

 

다음은 만들어본 쿼리


SELECT

        B.날짜, B.장비

FROM
    테이블_1 A as A
    , 테이블_2 B as B
WHERE

    A.장비 = B.장비(+)

    AND A.장비타입=301

    AND B.날짜 BETWEEN '12/01' AND '12/02'

GROUP BY

    B.날짜,

    B.장비

ORDER BY

    B.날짜,

    B.장비

 

이렇게 조회를 하면,

 

12/1  a    3
          b    7

12/2  c   11

 

 

이렇게 나옵니다.

"원하는 결과" 와 다르게, 지금 테이블_2 에 존재하는 데이터만 sum 된 결과만 나옵니다.

도움 부탁드립니다.

 

p.s

장비타입은 테이블_1 에서 a,b,c,d 를 구해오기 위한 조건 데이터 입니다.

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

with tab1 as(
select 'a' as jang from dual
union all
select 'b' as jang from dual
union all
select 'c' as jang from dual
union all
select 'd' as jang from dual
)
,  tab2 as(
select '20111201' yyyymmdd, 'a' jang, 1 cnt from dual
union all
select '20111201' yyyymmdd, 'a' jang, 2 cnt from dual
union all
select '20111201' yyyymmdd, 'b' jang, 3 cnt from dual
union all
select '20111201' yyyymmdd, 'b' jang, 4 cnt from dual
union all
select '20111202' yyyymmdd, 'c' jang, 5 cnt from dual
union all
select '20111202' yyyymmdd, 'c' jang, 6 cnt from dual
)
select a.jang, sum(cnt) sum_val
  From tab1 a
     , tab2 b
 where a.jang = b.jang(+)
   and b.yyyymmdd(+) = '20111202'
 group by rollup(a.jang)
 order by 1
 

수량은 NVL처리를 하시면 되고, 날짜는 조회에 이용되는 값을 직접 출력하시면 될 듯 싶습니다.

양승원(hanul072)님이 2011-12-08 10:48에 작성한 댓글입니다.
이 댓글은 2011-12-08 10:52에 마지막으로 수정되었습니다.

with
t1 as
(   
    select 'a' eq from dual union all
    select 'b' eq from dual union all
    select 'c' eq from dual union all
    select 'd' eq from dual
)
,t2 as
(
    select '20111201' dt, 'a' eq, 1 qt from dual union all
    select '20111201' dt, 'a' eq, 2 qt from dual union all
    select '20111201' dt, 'b' eq, 3 qt from dual union all
    select '20111201' dt, 'b' eq, 4 qt from dual union all
    select '20111202' dt, 'c' eq, 5 qt from dual union all
    select '20111202' dt, 'c' eq, 6 qt from dual
)
select
        decode( grouping_id( v2.dt, v2.eq ), 0, v2.dt, 1, 'sub total', 3, 'total' ) dt
    ,   v2.eq
    ,   nvl( sum( t2.qt ), 0 ) qt
from
        (
            --
            -- view for base data( eq, dt )
            --
            select  *
            from
                    t1
                ,   (
                        --
                        --  view for dummy data( dt )
                        --
                        select  to_char( sysdate - level, 'yyyymmdd' ) dt
                        from    dual
                        connect by
                                level <= 7  
                    ) v1
        ) v2
    ,   t2
where   1=1
and     v2.dt   between '20111201' and '20111205'
and     v2.dt   = t2.dt(+)
and     v2.eq   = t2.eq(+)
group by
        rollup( v2.dt, v2.eq )

으이구님이 2011-12-08 11:29에 작성한 댓글입니다. Edit

양승원님.

으이구님.

 

감사합니다. 

두 분 덕분에 DB의 던전으로 들어오는 길의 수고를 좀 덜었습니다.

사무실에 있는 "대용량데이터베이스솔루션 2" 를 예전부터 보려고 작심하고 있었는데, 

좀 더 수월하게 볼 거 같습니다.

 

한동안 개발에 손을 띄고 있다가 다시금 개발에 발을 담그는 순간

스스로 한없이 초라해져 보이는 기분입니다.

 

갑작스레 옮겨온 회사의 빠듯한 일정과, 원활하지 않은 언어를 쓰다보니 압박감이 좀 크네요.

민망함을 무릅쓰고 도움을 요청하였습니다.

 

두 분 모두

즐거운 연말과

새해 복 많이 받으세요.

 

김기운(kku911)님이 2011-12-08 13:42에 작성한 댓글입니다.

11G 버전에서는 Partition Outer Join 이 됩니다.

WITH t1 AS
(
SELECT 'a' cd FROM dual
UNION ALL SELECT 'b' FROM dual
UNION ALL SELECT 'c' FROM dual
UNION ALL SELECT 'd' FROM dual
)
, t2 AS
(
SELECT '2011-12-01' dt, 301 gb, 'a' cd, 1 v FROM dual
UNION ALL SELECT '2011-12-01', 301, 'a', 2 FROM dual
UNION ALL SELECT '2011-12-01', 301, 'b', 3 FROM dual
UNION ALL SELECT '2011-12-01', 301, 'b', 4 FROM dual
UNION ALL SELECT '2011-12-02', 301, 'c', 5 FROM dual
UNION ALL SELECT '2011-12-02', 301, 'c', 6 FROM dual
)
SELECT NVL(b.dt, '전체') dt
     , NVL(a.cd, '합') cd
     , NVL(SUM(b.v), 0) v
  FROM t1 a
  LEFT OUTER JOIN t2 b
  PARTITION BY (b.dt)
    ON a.cd = b.cd
   AND b.gb = 301
   AND b.dt BETWEEN '2011-12-01' AND '2011-12-02'
 GROUP BY ROLLUP(b.dt, a.cd)
;

마농(manon94)님이 2011-12-08 19:32에 작성한 댓글입니다.

마농님 감사합니다.

 

제가 쓰는 DB가 11g 인지 어떻게 아셨나요 ? ^^ㅎㅎㅎ

잘쓰겠습니다. 

 

낼 모레면 마흔인데 다시금 개발을 왕성하게 하고 있으니

나이먹는 불안함이 줄어드네요. ^^

김기운(kku911)님이 2011-12-09 10:23에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39158RAC 병렬처리 속도 질문 [1]
김병수
2011-12-12
4003
39156ora-04091 에러 관련 도움좀 부탁드립니다. ㅜㅜ [1]
정의석
2011-12-12
4479
39155서버가 자기자신에게 계속 접근합니다
김허세
2011-12-09
3642
39154left outer join, 날짜 기준 sum, 합계, 총합계 [5]
김기운
2011-12-07
8513
39153MS-Sql 만쓰다가 Oracle로 넘어왔습니다. 임시테이블, 메모리테이블 문제..
유정헌
2011-12-07
4730
39152쿼리문 장 사용방법에 대한 질문입니다... [1]
집게사장
2011-12-07
3804
39151디비링크된 테이블에 insert/update 는 원래 안되는거 아닌가요? [2]
김태연
2011-12-06
6637
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.024초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다