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 41223 게시물 읽기
No. 41223
양쪽방향에 따른 계산 그리고 결과(도와주세요)
작성자
기쁨이(dojava)
작성일
2016-08-26 14:39ⓒ
2016-08-26 15:16ⓜ
조회수
6,929

TABLE BIZ

 

SEND TARGET PAY

A B 10,000

B A -15,000

 

1. 검색 A, B

 

SELECT SEND, TARGET, SUM(PAY)

FROM (

SELECT SEND, TARGET, SUM(PAY), 'S' AS GUBUN

FROM BIZ

WHERE SEND = A

AND TARGET = B

GROUP BY SEND, TARGET

UNION ALL

SELECT SEND, TARGET, SUM(PAY), 'T' AS GUBUN

FROM BIZ

WHERE SEND = B

AND TARGET = A

GROUP BY SEND, TARGET

)

 

RESULT : A -> B 매출 +10,000

 

2. 검색 B, A

 

SELECT SEND, TARGET, SUM(PAY)

FROM (

SELECT SEND, TARGET, SUM(PAY), 'S' AS GUBUN

FROM BIZ

WHERE SEND = B

AND TARGET = A

GROUP BY SEND, TARGET

UNION ALL

SELECT SEND, TARGET, SUM(PAY), 'T' AS GUBUN

FROM BIZ

WHERE SEND = A

AND TARGET = B

GROUP BY SEND, TARGET

)

RESULT : B -> 매입 -5,000

 

결과는 아래의 정의 처럼 표기

A, B 검색시 A 에서 B로 매출/매입

B, A 검색시 B 에서 A로 매출/매입

단, 양쪽의 매입/매출을 더하여 높은숫자의 부호를 따라가도록 결과 표기

 

 

A -> B 매입 -5,000

B -> A 매출 +10,000

========== 현재 위의 결과를 가지고 있고 아래의 결과값을 얻고자 함

B -> A 매출 +5000

 

도와주십시요^^

 

 

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

조회 조건이 (A, B), (B, A) 형태로 각각 주어질때의 결과를 구하라는 것인지?
아니면 (A, B), (B, A) 는 최종 결과물을 얻기 위한 중간 과정을 설명한 것인지?
예시자료와 성명의 결과가 일치하지 않는 듯 하여 헷갈립니다.
위에 길고 복잡한 설명 다 무시하고 맨 아래 4줄만 보면 될까요?

마농(manon94)님이 2016-08-26 15:22에 작성한 댓글입니다.

예, 아래 네줄만 보아주셔도 될것 같습니다.

핵심정리가 잘 안된것 같네요 ^^

 

부탁 드리겠습니다.

기쁨이(dojava)님이 2016-08-26 15:33에 작성한 댓글입니다.

WITH biz AS
(
SELECT 'A' send, 'B' target, -5000 pay FROM dual
UNION ALL SELECT 'B', 'A', 10000 FROM dual
)
SELECT send, target, pay
  FROM (SELECT send, target
             , SUM(SUM(pay)) OVER() pay
             , ROW_NUMBER() OVER(ORDER BY ABS(SUM(pay)) DESC, send) rn
          FROM biz
         WHERE (send, target) IN (('A','B'), ('B','A'))
         GROUP BY send, target
        )
 WHERE rn = 1
;

마농(manon94)님이 2016-08-26 15:45에 작성한 댓글입니다.

마농님 답변 감사드립니다.

 

WHERE 절에 IN 데이터에 A,B B,A 의 데이터가 단일이면서 같아야만 나오는것인지요

다중의 코드성 데이터를 넣었더니 오류(ora-01427) 를 리턴 받네요.

 

여러개의 다중 데이터가 다대다 관계로 묶여있어서요..

 

기쁨이(dojava)님이 2016-08-26 16:11에 작성한 댓글입니다.
이 댓글은 2016-08-26 16:12에 마지막으로 수정되었습니다.

원본대비 결과표 예를 들어 주세요.

마농(manon94)님이 2016-08-26 16:14에 작성한 댓글입니다.

# 세금계산서

 

전송일 구분 일자 공급자 공급사업자 구분2 공급받는자 공급받는자사업자 금액

20160607 | 미발행 | 20160104-20160129 | 공급자명 | 222-22-22222 | 매출 | 공급받는자명 | 111-11-11111 | -6,086,333

20160607 | 미발행 | 20160123-20160130 | 공급자명 | 111-11-11111 | 매입 | 공급받는자명 | 222-22-22222 | 94,212

20160607 | 미발행 | 20160201-20160229 | 공급자명 | 222-22-22222 | 매출 | 공급받는자명 | 111-11-11111 | -4,753,929

20160607 | 미발행 | 20160205-20160227 | 공급자명 | 111-11-11111 | 매입 | 공급받는자명 | 222-22-22222 | 108,233

20160607 | 미발행 | 20160301-20160331 | 공급자명 | 222-22-22222 | 매출 | 공급받는자명 | 111-11-11111 | -6,166,107

20160607 | 미발행 | 20160312-20160326 | 공급자명 | 111-11-11111 | 매입 | 공급받는자명 | 222-22-22222 | 86,338

20160607 | 미발행 | 20160401-20160430 | 공급자명 | 222-22-22222 | 매출 | 공급받는자명 | 111-11-11111 | -6,116,643

20160607 | 미발행 | 20160413-20160423 | 공급자명 | 111-11-11111 | 매입 | 공급받는자명 | 222-22-22222 | 147,777

20160607 | 미발행 | 20160502-20160531 | 공급자명 | 222-22-22222 | 매출 | 공급받는자명 | 111-11-11111 | -6,111,083

20160607 | 미발행 | 20160507-20160521 | 공급자명 | 111-11-11111 | 매입 | 공급받는자명 | 222-22-22222 | 79,732

20160704 | 미발행 | 20160601-20160630 | 공급자명 | 222-22-22222 | 매출 | 공급받는자명 | 111-11-11111 | -5,929,507

20160704 | 미발행 | 20160604-20160625 | 공급자명 | 111-11-11111 | 매입 | 공급받는자명 | 222-22-22222 | 71,653

20160803 | 미발행 | 20160701-20160729 | 공급자명 | 222-22-22222 | 매출 | 공급받는자명 | 111-11-11111 | -5,501,389

20160803 | 미발행 | 20160716-20160730 | 공급자명 | 111-11-11111 | 매입 | 공급받는자명 | 222-22-22222 | 90,955

 

 

구분 (검색시 A -> B 로)

미발행 | 20160104-20160130 | 검색조건A | 111-11-11111 | 매입 | 검색조건B | 222-22-22222 | - 5,992,121

미발행 | 20160201-20160120 | 검색조건A | 111-11-11111 | 매입 | 검색조건B | 222-22-22222 | - 4,645,696

미발행 | 20160301-20160131 | 검색조건A | 111-11-11111 | 매입 | 검색조건B | 222-22-22222 | - 6,079,769

미발행 | 20160404-20160430 | 검색조건A | 111-11-11111 | 매입 | 검색조건B | 222-22-22222 | - 5,968,866

..

..

..

요기까지가 현재 결과물입니다. 이결과물을 아래와 같이 변환하고 싶습니다.

검색란은 두개이며 공급자가 되는 사업자, 공급받는자가 되는 사업자로 조회

 

구분 (검색시 B -> A 로)

미발행 | 20160104-20160130 | 검색조건B | 222-22-22222 | 매출 | 검색조건A | 111-11-11111 | - 5,992,121

미발행 | 20160201-20160120 | 검색조건B | 222-22-22222 | 매출 | 검색조건A | 111-11-11111 | - 4,645,696

미발행 | 20160301-20160131 | 검색조건B | 222-22-22222 | 매출 | 검색조건A | 111-11-11111 | - 6,079,769

미발행 | 20160404-20160430 | 검색조건B | 222-22-22222 | 매출 | 검색조건A | 111-11-11111 | - 5,968,866

..

..

..

 

1,2 로우의 데이터를 취합하고자 합니다.

해당월의 공급자, 공급받는자에 대한 내용을 취합하여 하나의 ROW로 만들고 싶습니다.

-가 되면 매출이고, +가 되면 매입입니다.

 

기쁨이(dojava)님이 2016-08-26 16:44에 작성한 댓글입니다.
이 댓글은 2016-08-26 17:18에 마지막으로 수정되었습니다.

또 다시 헷갈리게 만드는 결과물이네요.설명도 없고.

마농(manon94)님이 2016-08-26 16:53에 작성한 댓글입니다.

위에 댓글 수정하였습니다 ^^

기쁨이(dojava)님이 2016-08-26 17:26에 작성한 댓글입니다.

WITH biz (dt, send, gb, target, pay) AS
(
          SELECT '20160104-20160129', '222-22-22222', '매출', '111-11-11111', -6086333 FROM dual
UNION ALL SELECT '20160123-20160130', '111-11-11111', '매입', '222-22-22222',    94212 FROM dual
UNION ALL SELECT '20160201-20160229', '222-22-22222', '매출', '111-11-11111', -4753929 FROM dual
UNION ALL SELECT '20160205-20160227', '111-11-11111', '매입', '222-22-22222',   108233 FROM dual
UNION ALL SELECT '20160301-20160331', '222-22-22222', '매출', '111-11-11111', -6166107 FROM dual
UNION ALL SELECT '20160312-20160326', '111-11-11111', '매입', '222-22-22222',    86338 FROM dual
UNION ALL SELECT '20160401-20160430', '222-22-22222', '매출', '111-11-11111', -6116643 FROM dual
UNION ALL SELECT '20160413-20160423', '111-11-11111', '매입', '222-22-22222',   147777 FROM dual
UNION ALL SELECT '20160502-20160531', '222-22-22222', '매출', '111-11-11111', -6111083 FROM dual
UNION ALL SELECT '20160507-20160521', '111-11-11111', '매입', '222-22-22222',    79732 FROM dual
UNION ALL SELECT '20160601-20160630', '222-22-22222', '매출', '111-11-11111', -5929507 FROM dual
UNION ALL SELECT '20160604-20160625', '111-11-11111', '매입', '222-22-22222',    71653 FROM dual
UNION ALL SELECT '20160701-20160729', '222-22-22222', '매출', '111-11-11111', -5501389 FROM dual
UNION ALL SELECT '20160716-20160730', '111-11-11111', '매입', '222-22-22222',    90955 FROM dual
)

SELECT ym
     , send
     , target
     , DECODE(SIGN(pay), 1, '매입', -1, '매출') gb
     , pay
  FROM (SELECT SUBSTR(dt, 1, 6) ym
             , send
             , target
             , SUM(SUM(pay)) OVER(PARTITION BY SUBSTR(dt, 1, 6)) pay
             , ROW_NUMBER()  OVER(PARTITION BY SUBSTR(dt, 1, 6)
                                      ORDER BY ABS(SUM(pay)) DESC, send) rn
          FROM biz
         WHERE (send, target) IN ( ('111-11-11111', '222-22-22222')
                                 , ('222-22-22222', '111-11-11111')
                                 )
         GROUP BY SUBSTR(dt, 1, 6), send, target
        )
 WHERE rn = 1
;

마농(manon94)님이 2016-08-26 17:30에 작성한 댓글입니다.

감사합니다.

 

잘 적용해보도록 하겠습니다. ^^

 

고생하셨습니다.

염진호(dojavadt)님이 2016-08-26 17:57에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41226급합니다 도와주세요 마감과 당월까지의 합게 [1]
울산
2016-08-29
6603
41225간단한 날짜 쿼리 [2]
울산
2016-08-26
6693
41224이 쿼리 도움 부탁드립니다 [3]
매수신호
2016-08-26
6920
41223양쪽방향에 따른 계산 그리고 결과(도와주세요) [10]
기쁨이
2016-08-26
6929
41222oracle procedure subquery 사용 [2]
김정환
2016-08-26
6176
41221오라클 프로시저에서 in 변수로 던진값 사용법문의입니다 [1]
초보자
2016-08-26
6464
41220left join 시 조건 [1]
궁금이
2016-08-25
6030
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.049초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다