단일 sql구문으로 특정값 기준으로 sum이 될까요? 1 11 1,078

by 빳데리빵빵 [SQL Query] [2017.08.22 21:03:39]


안녕하세요 한참 sql을 배우고 있습니다

다름이아니라 특정 조건 기준으로 값을 sum하고 바꾸는게 단일 sql 구문으로 해보려 하니 잘 안되네요 

기준   값                        기준         값

1         100                       1            100

2          40                         2              80

3          40         ▷            3               0

4          50                          4             50

5        10                             5             110

6        100                             6              0

왼쪽 자료를 값 기준으로 50이 되는값 기준으로 sum을 하고 그 대상값은 0으로 채워 줄라하는데 잘 안되네요 어떻게 해야 할까요?? ㅠ.ㅠ

by 마농 [2017.08.23 08:36:07]

설명이 부족합니다. 설명과 결과가 일치하지 않는 것 같습니다.
왜 위와 같은 결과가 나왔는지? 각 행별로 설명해 주세요.
혹시 예시 자료에 오류는 없는지 확인해 주세요.


by 빳데리빵빵 [2017.08.23 08:42:48]

왼쪽의 자료를 가지고 오른쪽을 만드는데 기준1은 기준값 50이 넘었으니 패스 기준2는 기준값이 50이 안되니 다음 기준인 3값을 가져와 더해서 80이 되고 기준3값은 2에서 가져다 썼으니 0 이렇게 들어있는 값들을 50 기준으로 로우별로 더해줘야 하는데 프로시져로 만들어 루프 돌려야하는지...  단일 구문으론 방법이 없나해서요;;


by 마농 [2017.08.23 08:48:02]

제가 설명해 달라고 한 이유는
결과행들이 일관성이 없어 보여서 입니다.
5,6 행은 앞쪽의 행들과 처리 기준이 다른가요?


by jkson [2017.08.23 09:14:14]

5,6행은 잘못 예시를 잘못 작성하신듯.. 5행이 50이 넘으니 100 그대로 나와야할 것 같네요.

with t as
(
select 1 rn, 100 val from dual union all
select 2 rn, 40 val from dual union all
select 3 rn, 40 val from dual union all
select 4 rn, 50 val from dual union all
select 5 rn, 100 val from dual union all
select 6 rn, 10 val from dual
)
select rn
     , decode(row_number() over (partition by fg order by rn),1,sum(val) over(partition by fg),0) val
  from
    (
    select rn, val, fg + case when val >= 50 then max(rn) over() else 0 end fg
     from
        (
        select rn, val, sum(case when val >= 50 then 1 end ) over(order by rn) fg
          from t                
        )
    )
 order by rn

 


by 마농 [2017.08.23 09:55:17]

40 이 연속 3개 이상 나오는 경우에.
 - (40 + 40 + 40) 이 되어야 할까요? 각각이 50 미만 이므로 다 더함
 - (40 + 40), (40) 이 되어야 할까요? 50 이 넘는 시점에서 한번 끊어줌


by jkson [2017.08.23 10:31:24]

아.. 50 넘는 값 기준으로 이후 행들은 다 더하는 걸로 만들었는데.. 정확한 기준을 다시 알려주셔야할 것 같네요.


by 빳데리빵빵 [2017.08.23 10:16:00]

아 죄송해요 핸펀으로 문의드리다보니 오타가 있네요 5,6행은 수정했습니다

마농님 말씀데로 그런 경우도 있겠네요 ;;


by jkson [2017.08.23 10:31:58]

연속 3개일 때 2개에서 끊어야 하나요?


by 빳데리빵빵 [2017.08.23 10:37:46]

네 마농님 말씀대로 40+40으로 갯수로 끊는것이 아니라 더한 값이 50이 넘는 시점에서 끊는게 맞는거 같아요


by 마농 [2017.08.23 11:04:34]
WITH t AS
(
SELECT 1 rn, 100 v FROM dual
UNION ALL SELECT 2,  40 FROM dual
UNION ALL SELECT 3,  40 FROM dual
UNION ALL SELECT 4,  50 FROM dual
UNION ALL SELECT 5,  10 FROM dual
UNION ALL SELECT 6, 100 FROM dual
)
, tmp(rn, v, gb, flag) AS
(
SELECT rn
     , v
     , 1 gb
     , 1 flag
  FROM t
 WHERE rn = 1
 UNION ALL
SELECT c.rn
     , CASE WHEN p.v < 50 THEN p.v ELSE 0 END + c.v  AS v
     , CASE WHEN p.v < 50 THEN   0 ELSE 1 END + p.gb AS gb
     , CASE WHEN p.v < 50 THEN   0 ELSE 1 END        AS flag
  FROM tmp p
     , t c
 WHERE c.rn = p.rn + 1
)
SELECT rn
     , DECODE(flag, 1, MAX(v) OVER(PARTITION BY gb), 0) v
  FROM tmp
;

 


by 빳데리빵빵 [2017.08.23 12:51:06]

우아.....마농님, jkson님께 많이 배워갑니다 보고 또 봐서 열심히 익힐께요 ^^

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