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 41144 게시물 읽기
No. 41144
쿼리질문 입니다! N 대 N의 관계..
작성자
노력하는초보
작성일
2016-04-27 11:10ⓒ
2016-04-27 11:20ⓜ
조회수
8,181

수고많으십니다

쿼리를 뽑고싶은데 도저히 방안이 안떠올라 도움을 요청합니다 ㅠㅠ

일단 저의 문제를 말로써 설명드릴게요..이해하기 어려울수있겠지만...

 

T1 이라는 테이블에                                      T2 라는 테이블

빌번호   상품    상품액                             빌번호         결제유형      결제금액

001        사과      5000                                001               현금              8000

001        수박      3000                                002               현금              7000

002        마우스   2000                                002               쿠폰              6000

             키보드   10000

002       사과         1000

이런식으로 데이터가 서로 들어있을때...

제가원하는 조회결과는

 

상품      총상품액            현금총결제금액   쿠폰총결제금액    

사과        6000                           6000(?)                     0(?)

수박        3000                          3000 (?)                    0(?)

마우스     2000                        2000   (?)                 0(?)

키보드    10000                        4000 (?)                    6000(?)

                            이부분총합은 15000이되야함..            이부분총합은 6000이 되야함...

 

서로 PK? 는 빌번호로 알수있으나   N 대 N의 관계라...어떻게 계산해야할지난감합니다

(?)부분은 N빵???을 하라고 하긴하는데...총합은 맞아야한다구하고....감이 안옵니다 ㅠㅠ도와주십시요 ㅠ

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

002 의 경우 현금 7000원과 쿠폰 6000원이
상품별로 나누어 지는 형태가 너무 다양하네요.
처리 우선 순위가 정해져야 할 듯 하네요.
저는 상품 순서대로 쿠폰부터 우선 적용되도록 기준을 잡았습니다.


WITH t1 AS
(
SELECT '001' no, '사과' cd, 5000 prc FROM dual
UNION ALL SELECT '001', '수박'  ,  3000 FROM dual
UNION ALL SELECT '002', '마우스',  2000 FROM dual
UNION ALL SELECT '002', '키보드', 10000 FROM dual
UNION ALL SELECT '002', '사과'  ,  1000 FROM dual
)
, t2 AS
(
SELECT '001' no, '현금' gb, 8000 amt FROM dual
UNION ALL SELECT '002', '현금', 7000 FROM dual
UNION ALL SELECT '002', '쿠폰', 6000 FROM dual
)
SELECT cd
     , SUM(x) 합계
     , SUM(DECODE(gb, '현금', x)) 현금
     , SUM(DECODE(gb, '쿠폰', x)) 쿠폰
  FROM (SELECT a.no, a.cd, a.prc, a.s_prc
             , b.gb, b.amt, b.s_amt
             , LEAST( a.prc
                    , b.amt
                    , b.s_amt - a.s_prc + a.prc
                    , a.s_prc - b.s_amt + b.amt
                    ) x
          FROM (SELECT no, cd, prc
                     , SUM(prc) OVER(PARTITION BY no ORDER BY cd) s_prc
                  FROM t1
                ) a
             , (SELECT no, gb, amt
                     , SUM(amt) OVER(PARTITION BY no ORDER BY gb) s_amt
                  FROM t2
                ) b
         WHERE a.no = b.no
           AND a.s_prc - a.prc < b.s_amt
           AND b.s_amt - b.amt < a.s_prc
        )
 GROUP BY ROLLUP(cd)
;

마농(manon94)님이 2016-04-27 13:01에 작성한 댓글입니다.

정말감사합니다 덕분에 많은도움이 됫습니다 오늘하루도 화이팅입니다

노력하는초보님이 2016-04-27 17:58에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
41148sql 튜닝 문의입니다. [2]
이현정
2016-05-03
8277
41147프로시저->프로시저 호출 문의입니다.. [2]
노력하는초보자
2016-05-03
7894
41145회사 그룹별 평균의 최대 최소값의 회사 하나씩 뽑는거 질문이요
박양희
2016-04-29
7900
41144쿼리질문 입니다! N 대 N의 관계.. [2]
노력하는초보
2016-04-27
8181
41143쿼리 도움 요청 드립니다..
검콤이
2016-04-26
7955
41142쿼리 도와주세요^^ [3]
강승현
2016-04-25
7832
41141마농님 좀 도와주세요 ㅠㅠ
박양희
2016-04-25
7839
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.054초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다