진행수량 계산 0 1 8,100

by 천사원이 [SQL Query] MSSQL [2025.02.06 20:33:35]


캡처.PNG (16,081Bytes)

MSSQL 사용중입니다.

Table1의  A_Qty를 기준으로 해서 Table2의 B_Qty을 배분 하려고 합니다.

예를 들면.. Table1 조회 시

첫번째 행 (A_Seq = 1) 동일한 Sort를 Table2에서 찾아서, A_Qty가 8개니까 Table2의 1행까지의  B_Qty를 Table1의 첫번째 행에 배분한다

두번째 행 (A_Seq = 2) 동일한 Sort를 Table2에서 찾아서, A_Qty가 8개니까 Table2의 2~4행까지의  B_Qty를 Table1의 두번째 행에 배분하고 Table2 4번행의 B_Qty는 5개로 잔량을 남긴다

세번째 행 (A_Seq = 3) 동일한 Sort를 Table2에서 찾아서, A_Qty가 8개니까 Table2의 4~5행까지의  B_Qty를 Table1의 두번째 행에 배분하고 Table2 5번행의 B_Qty는 6개로 잔량을 남긴다

배분이 종료되고 Table2에 잔량이 남았다면 동일한 Sort의 Table1 데이터 중 A_Seq가 가장 작은 값에 잔량을 모두 더해준다

 

이런 로직을 구현하고 싶은데,,, 어떻게 시작해야 될지 도통 모르겠네요...

 

 

 

by 마농 [2025.02.18 11:10:15]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
WITH t1 AS
(
SELECT 1 a_seq, 100 a_serl, 8 a_qty, 10 b_seq, 1 b_serl, 1 sort, 20250201 date
UNION ALL SELECT 2, 200, 8, 10, 1, 2, 20250202
UNION ALL SELECT 3, 300, 8, 10, 1, 2, 20250202
)
, t2 AS
(
SELECT 10 b_seq, 1 b_serl, 1 b_subserl, 1 sort, 8 b_qty
UNION ALL SELECT 10, 1, 2, 2, 4
UNION ALL SELECT 10, 1, 3, 2, 3
UNION ALL SELECT 10, 1, 4, 2, 6
UNION ALL SELECT 10, 1, 5, 2, 9
)
SELECT a.a_seq
     , a.a_serl
     , CASE WHEN a.a_qty_s           <= b.b_qty_s THEN a.a_qty
            WHEN a.a_qty_s - a.a_qty <= b.b_qty_s THEN b.b_qty_s - a.a_qty
            ELSE 0 END
     + CASE WHEN a.a_qty_t < b.b_qty_s AND rn = 1
            THEN b.b_qty_s - a.a_qty_t
            ELSE 0 END
    AS b_qty
  FROM (SELECT a_seq, a_serl, a_qty
             , b_seq, b_serl, sort
             , SUM(a_qty) OVER(PARTITION BY sort) a_qty_t
             , SUM(a_qty) OVER(PARTITION BY sort ORDER BY a_seq, a_serl) a_qty_s
             , ROW_NUMBER() OVER(PARTITION BY sort ORDER BY a_seq, a_serl) rn
          FROM t1
        ) a
  LEFT OUTER JOIN
       (SELECT b_seq, b_serl, sort
             , SUM(b_qty) b_qty_s
          FROM t2
         GROUP BY b_seq, b_serl, sort
        ) b
    ON a.b_seq  = b.b_seq
   AND a.b_serl = b.b_serl
   AND a.sort   = b.sort
;

 

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