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 41242 게시물 읽기
No. 41242
TABLE 변동사항 비교하여 표기 질문드립니다.
작성자
기쁨이(dojava)
작성일
2016-09-19 15:59ⓒ
2016-09-19 16:01ⓜ
조회수
6,269

안녕하세요 질문좀 드려봅니다

 

1차로 원천데이터에서 TABLE A, TABLE X 라는 집계데이터를 생성하였습니다.

-TABLE X 는 변동이 없는 데이터(마감 데이터)

-TABLE A 는 유동적인 데이터 (원천데이터에서 언제든 집계를 돌려서 생성할 수 있는 테이블)

2차로 원천데이터에 추가적으로 수정되어진 데이터가 들어와서 다시 table A 가 다시 집계되었습니다.

 

table x (status가 Y가 되면 데이터 수정 불가)

send target stdt endt epay status

1000 9999 20160801 20160831 10,000 Y

1110 9998 20160801 20160831 20,000 Y

1111 9997 20160801 20160831 30,000 Y

 

table a (변동 전)

send target stdt endt epay status

1000 9999 20160801 20160831 10,000 Y

1110 9998 20160801 20160831 20,000 Y

1111 9997 20160801 20160831 30,000 Y

-----> 원천데이터가 변동되어 집계데이터가 업데이트 되었습니다. (table a만 변동, table x는 변동 없음)

table a (변동 후)

send target stdt endt epay status

1000 9999 20160801 20160831 10,500 Y

1110 9998 20160801 20160831 20,000 Y

1111 9997 20160801 20160831 30,000 Y

 

★ 표기하고 싶은 목록

 

send target stdt endt epay status

1000 9999 20160801 20160831 10,000 Y

1000 9999 20160801 20160831 500 N

1110 9998 20160801 20160831 20,000 Y

1111 9997 20160801 20160831 30,000 Y

 

차액을 구하여서 해야 하는건지, 업무가 잘못된건지..

부탁좀 드리겠습니다.

마감되지 않은 500을 구하고 STATUS를 N으로 표기하고 싶습니다.

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

WITH x(send, target, stdt, endt, epay, status) AS
(
          SELECT 1000, 9999, '20160801', '20160831', 10000, 'Y' FROM dual
UNION ALL SELECT 1110, 9998, '20160801', '20160831', 20000, 'Y' FROM dual
UNION ALL SELECT 1111, 9997, '20160801', '20160831', 30000, 'Y' FROM dual
)
, a(send, target, stdt, endt, epay, status) AS
(
          SELECT 1000, 9999, '20160801', '20160831', 10500, 'Y' FROM dual -- 변경
UNION ALL SELECT 1110, 9998, '20160801', '20160831', 20000, 'Y' FROM dual
UNION ALL SELECT 1111, 9997, '20160801', '20160831', 30000, 'Y' FROM dual
UNION ALL SELECT 1112, 9996, '20160801', '20160831', 40000, 'Y' FROM dual -- 추가
)

SELECT a.send 
     , a.target
     , a.stdt 
     , a.endt 
     , DECODE(c.lv, 1, x.epay, a.epay - NVL(x.epay, 0)) epay
     , DECODE(c.lv, 1, 'Y', 'N') status
  FROM x
     , a
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 2) c
 WHERE a.send   = x.send  (+)
   AND a.target = x.target(+)
   AND a.stdt   = x.stdt  (+)
   AND a.endt   = x.endt  (+)
   AND c.lv    >= DECODE(x.epay,   NULL, 2, 1)
   AND c.lv    <= DECODE(x.epay, a.epay, 1, 2)
   AND a.stdt   = '20160801'
   AND a.endt   = '20160831'
;

마농(manon94)님이 2016-09-19 18:06에 작성한 댓글입니다.
이 댓글은 2016-09-19 18:07에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
41246시분초만 계산하여 범위를 구하기 [4]
김용완
2016-09-24
6782
4124409:00 ~ 15:30 형식으로 사이 시간을 구하는 방법 [3]
김씨
2016-09-22
6308
41243Oracle 12c Enterprise 버전 윈도우 32bit 문의 [1]
박종혁
2016-09-21
6805
41242TABLE 변동사항 비교하여 표기 질문드립니다. [1]
기쁨이
2016-09-19
6269
41241각 테이블의 최신 한건을 가져오는 방법이 궁금합니다.
fvoel
2016-09-17
7292
41239연속 데이터 중 일부분의 평균값을 산출하는 방법 문의드립니다. [1]
손정하
2016-09-12
6249
41238(질문)프로시져 호출시 성능 저하
이철우
2016-09-12
6330
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.050초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다