각 로우마다 특정값을 연속해서 빼는 쿼리 문의 드립니다 0 2 3,016

by 웬쑤 [SQL Query] 웬쑤 쿼리 [2012.12.23 10:52:12]



잔여 콘도 숙박일 계산 쿼리를 짜는데 답이 나오지 않아 문의 드립니다


평일사용__주말사용__평일잔여일__주말잔여일
1_________1_________2__________1
1_________0_________1__________1
1_________0_________0__________0


총 숙박일은 주말 포함 총 3일 이용할 수 있고
추말은 총 2일을 이용 할 수 있습니다

테이블에 저장되어 있는 데이터는 '평일사용', '주말사용' 컬럼밖에 없고
'평일잔여', '주말잔여'컬럼은 쿼리로 출력을 해야 합니다

1행에서
평일잔여 : 3 - 평일사용(1) = 2
주말잔여 : 2 - 주말사용(1) = 1

2행에서
평일잔여 : 남은 평일 사용일수(2) - 평일사용(1) = 1
주말잔여 : 남은 주말 사용일수(1) - 주말사용(0) = 1

3행에서
평일잔여 : 남은 평일 사용일수(1) - 평일사용(1) = 0
주말잔여 : 남은 주말 사용일수(1) - 주말사용(0) = 0 -> 총 3일의 숙박일을 소진했으므로 0으로 출력

이렇게 출력이 되게 할려면 어떻게 해야 할까요?

with basic as
(
select rownum as num
, 평일사용
, 주말사용
  from 숙박사용
)
select 3 - sum(평일사용) as 평일잔여일
, 2 - sum(주말사용) as 주말잔여일
  from basic
 where 1=1
   and num <= 1
union all
select 3 - sum(평일사용) as 평일잔여일
, 2 - sum(주말사용) as 주말잔여일
  from basic
 where 1=1
   and num <= 2
union all
select 3 - sum(평일사용) as 평일잔여일
, 2 - sum(주말사용) as 주말잔여일
  from basic
 where 1=1
   and num <= 3

이런식으로 구현 해봤는데 로우수가 2개인 경우 문제가 발생해서 사용하지 못하고 있습니다

by 아린 [2012.12.23 13:00:56]
평일사용__주말사용__평일잔여일__주말잔여일
1_________1_________2__________1
1_________0_________1__________1
1_________0_________0__________0

1행에서 
평일잔여 : 3 - 평일사용(1) = 2
주말잔여 : 2 - 주말사용(1) = 1

총 숙박일은 주말 포함 총 3일 이용할 수 있고
추말은 총 2일을 이용 할 수 있습니다

=================================

총 숙박일이 주말 포함 총 3일 이용 할 수 있으면 
1행에서 평일사용(1), 주말사용(1) 이면 사용한 날이 총 2일이 되어야 하지 않나요.

      평일사용__주말사용__평일잔여일__주말잔여일
      1_________1_________2__________1

==> 1_________1_________1__________1     로 되어야 할 듯 한데요.


WITH basic(평일사용,주말사용) AS(
SELECT  0, 1 FROM dual UNION ALL
SELECT  1, 0 FROM dual UNION ALL
SELECT  1, 0 FROM dual 
)
SELECT 평일사용, 주말사용, 평일누계, 주말누계
     , (3-평일누계-주말누계) 평일잔여일
     , CASE WHEN (3-평일누계-주말누계) < (2-주말누계) THEN (3-평일누계-주말누계) 
            ELSE (2-주말누계) END 주말잔여일 
  FROM
      (SELECT 평일사용, 주말사용
           , SUM(평일사용) OVER(ORDER BY ROWNUM) 평일누계
           , SUM(주말사용) OVER(ORDER BY ROWNUM) 주말누계
         FROM basic)

by 웬쑤 [2012.12.23 14:03:46]

헐~ 너무 감사합니다~

sum() over()를 사용하면 되는군요 ㅋ

lag만 사용해서 sum은 전혀 생각도 못했네요~^^

with절에 저런식으로 데이터를 넣어서 사용하는 법도 새로 알게되었네요 ^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입