쿼리 질문입니다. 0 4 1,417

by 무지버기 [2022.05.31 16:37:57]


아래와 같은 예제의 결과값을 얻고 싶은데 잘 안 되네요.

EX1)

A씨 -10,000,000
B씨   5,000,000
C씨   3,000,000
D씨   3,000,000
E씨  -1,000,000

결과 표

B씨 -> A씨 5,000,000
C씨 -> A씨 3,000,000
D씨 -> A씨 2,000,000
D씨 -> E씨 1,000,000

EX2)

 A씨  10,000,000
 B씨  -5,000,000
 C씨  -3,000,000
 D씨  -3,000,000
 E씨   2,000,000
 F씨  -1,000,000

결과 표

A씨 -> B씨 5,000,000
 A씨 -> C씨 3,000,000
 A씨 -> D씨 2,000,000
 E씨 -> D씨 1,000,000
 E씨 -> F씨 1,000,000

DB는 오라클입니다.

by 신이만든지기 [2022.05.31 17:24:58]

결과표 나온 수치들이 어떤 규칙이나 계산에 의해 나오는 건가요?


by 무지버기 [2022.05.31 17:30:38]

플러스 금액을 가진 사람이 마이너스 가진 분에게 마이너스 금액 만큼 넘겨주기만 하면 됩니다.

 


by 마농 [2022.05.31 17:32:51]
WITH t AS
(
SELECT 'EX1' gb, 'A씨' nm, -10000000 amt FROM dual
UNION ALL SELECT 'EX1', 'B씨',   5000000 FROM dual
UNION ALL SELECT 'EX1', 'C씨',   3000000 FROM dual
UNION ALL SELECT 'EX1', 'D씨',   3000000 FROM dual
UNION ALL SELECT 'EX1', 'E씨',  -1000000 FROM dual
UNION ALL SELECT 'EX2', 'A씨',  10000000 FROM dual
UNION ALL SELECT 'EX2', 'B씨',  -5000000 FROM dual
UNION ALL SELECT 'EX2', 'C씨',  -3000000 FROM dual
UNION ALL SELECT 'EX2', 'D씨',  -3000000 FROM dual
UNION ALL SELECT 'EX2', 'E씨',   1000000 FROM dual
)
, t1 AS
(
SELECT gb
     , nm
     , ABS(amt) amt
     , SIGN(amt) s
     , SUM(ABS(amt)) OVER(PARTITION BY gb, SIGN(amt) ORDER BY nm) sum_amt
  FROM t
)
SELECT a.gb
     , a.nm nm_a
     , b.nm nm_b
     , LEAST( a.amt
            , b.amt
            , b.sum_amt - a.sum_amt + a.amt
            , a.sum_amt - b.sum_amt + b.amt
            ) amt
  FROM t1 a
     , t1 b
 WHERE a.s = +1
   AND b.s = -1
   AND a.gb = b.gb
   AND a.sum_amt - a.amt < b.sum_amt
   AND b.sum_amt - b.amt < a.sum_amt
 ORDER BY gb, nm_a, nm_b
;
http://gurubee.net/lecture/2837

 


by 무지버기 [2022.05.31 17:43:29]

감사합니다.ㅎㅎ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입