한 행을 기준으로 그 앞 컬럼에 값을 적용 해보려합니다. 로직으로 접근이 어렵네요. 1 4 2,374

by 쭈니 [SQL Query] [2023.03.09 18:35:08]


  SELECT *
    FROM USER_SOURCE
   WHERE UPPER(TEXT) LIKE '%NET_DIE  1%';
   
   WITH TESTA AS (
   SELECT 1000 그룹,  'AAA' NAME, 0 IN_,  300 OUT, 1 POINT, 1 SEQ FROM DUAL
   UNION ALL
   SELECT 1000 그룹,  'AAA' NAME, 300 IN_,  300 OUT, 1 POINT, 2 SEQ FROM DUAL
   UNION ALL
   SELECT 1000 그룹,  'BBB' NAME, 300 IN_,  900000 OUT, 298 POINT, 3 SEQ FROM DUAL
   UNION ALL
   SELECT 1000 그룹,  'BBB' NAME, 900000 IN_,  900000 OUT, 1 POINT, 4 SEQ FROM DUAL
   UNION ALL
   SELECT 1000 그룹,  'BBB' NAME, 900000 IN_,  900000 OUT, 1 POINT, 5 ESQ FROM DUAL
   )
   SELECT *
     FROM TESTA

 

그룹 NAME IN_ OUT POINT SEQ
1000 AAA 0 300 1 1
1000 AAA 300 300 1 2
1000 BBB 300 900000 298 3
1000 BBB 900000 900000 1 4
1000 BBB 900000 900000 1 5

 

1000 이라는 그룹에서 POINT가 1이 아닌 SEQ 를기준으로 

그 SEQ보다 낮은 행의 IN, OUT 컬럼에 298이라는 1이 아닌것의 기준이되는 POINT 를 곱해주고싶습니다.

 

예시처럼 POINT가 1보다 클 때의 SEQ가 3 이라면

IN은 1,2,3 모두 POINT를 곱해지고,

OUT 은 3을 제외한 1,2 에 POINT를 곱해지게 하려합니다.

 

여러가지 시도해봤는데 해결하지 못해 도움 요청합니다.

SQL 로직 상으로 해결이 불가능한건가요?

감사합니다.

 

밑에는 원하는 차트 입니다

IN컬럼과 OUT 컬럼이 1을 초과한 POINT인 298로 곱해집니다.

그룹 NAME IN_ OUT POINT SEQ
1000 AAA 0 894000 1 1
1000 AAA 894000 894000 1 2
1000 BBB 894000 900000 298 3
1000 BBB 900000 900000 1 4
1000 BBB 900000 900000 1 5

 

 

by 마농 [2023.03.10 00:02:28]

1 이 아닌 값은 오직 1개 뿐인가요?
혹시 여러개 있지는 않은지?
여러개 가능하다면 결과는 어떤 형태로 나오게 되는지?

WITH testa AS
(
SELECT 1000 그룹, 'AAA' name, 0 in_, 300 out, 1 point, 1 seq FROM DUAL
UNION ALL SELECT 1000, 'AAA',    300,    300,   1, 2 FROM dual
UNION ALL SELECT 1000, 'BBB',    300, 900000, 298, 3 FROM dual
UNION ALL SELECT 1000, 'BBB', 900000, 900000,   1, 4 FROM dual
UNION ALL SELECT 1000, 'BBB', 900000, 900000,   1, 5 FROM dual
)
SELECT a.그룹
     , a.name
     , a.in_ * CASE WHEN a.seq <= b.seq THEN b.point ELSE 1 END in_
     , a.out * CASE WHEN a.seq <  b.seq THEN b.point ELSE 1 END out
     , a.point
     , a.seq
  FROM testa a
     , testa b
 WHERE a.그룹 = b.그룹
   AND b.point != 1
 ORDER BY a.그룹, a.seq
;

 


by 쭈니 [2023.03.10 08:12:14]

그룹 기준으로 1이 아닌값은 한개 뿐 입니다.


by 쭈니 [2023.03.10 09:12:00]

같은 테이블을 다시 활용해서 해결할 수 있었네요.. 감사합니다 마농님


by 마농 [2023.03.10 09:53:01]
WITH testa AS
(
SELECT 1000 그룹, 'AAA' name, 0 in_, 300 out, 1 point, 1 seq FROM DUAL
UNION ALL SELECT 1000, 'AAA',    300,    300,   1, 2 FROM dual
UNION ALL SELECT 1000, 'BBB',    300, 900000, 298, 3 FROM dual
UNION ALL SELECT 1000, 'BBB', 900000, 900000,   1, 4 FROM dual
UNION ALL SELECT 1000, 'BBB', 900000, 900000,   1, 5 FROM dual
)
SELECT 그룹
     , name
     , in_ * CASE WHEN seq <= m_seq THEN m_point ELSE 1 END in_
     , out * CASE WHEN seq <  m_seq THEN m_point ELSE 1 END out
     , point
     , seq
  FROM (SELECT 그룹, name, in_, out, point, seq
             , MAX(point) OVER(PARTITION BY 그룹) m_point
             , MAX(CASE WHEN point > 1 THEN seq END) OVER(PARTITION BY 그룹) m_seq
          FROM testa
        )
 ORDER BY 그룹, seq
;

 

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