2014-11-16 6 views
2

우선 순위에 따라 다른 행에 값을 분산하거나 값을 추가하는 SQL 쿼리를 작성하려고합니다.우선 순위에 따라 다른 행에 값을 배분하는 Oracle SQL 쿼리

내 시나리오입니다.

아래 데이터가있는 M_FLIGHT이라는 테이블이 있습니다.

DEPARTURE_DATE FLIGHT_NO FAIR_TYPE   PRIORITY AVAILABLE_SEATS MAX_CAPACITY RETURN_SEAT 
============== ========= ================= ======== =============== ============ =========== 
05-DEC-14  SC-917  Normal Fair   1   7    10    4 
05-DEC-14  SC-917  Maharaja Standard  2   8    10    0 
05-DEC-14  SC-917  Maharaja Special  3   9    10    0 

비행은 각각 우선 순위 1, 2, 3과 다른 공정 유형 (즉 일반 공정, 대왕 표준, 등등 대왕 델리 특별)을 가질 수있다.

사용자가 예약 한 좌석을 취소/반환하는 경우 RETURN_SEAT 값을 AVAILABLE_SEATS 값에 추가해야 해당 공정 유형에 대해 MAX_CAPACITY 값을 초과하지 않아야합니다.

초과하면 다음 우선 순위 (즉, 다음 공정 유형)에 나머지 값을 추가하십시오. 이 정보를

select f.*, sum(max_capacity-available_seats) as occupied, 
     sum(max_capacity-available_seats) over (order by priority) as cumeocc 
from m_flight f; 

당신이 v_Num 새로운 좌석을 할당 할 수 있습니다 : : 당신은 누적 합계를 사용하여 점유 공간을 계산할 수 있습니다

DEPARTURE_DATE FLIGHT_NO FAIR_TYPE   PRIORITY AVAILABLE_SEATS MAX_CAPACITY RETURN_SEAT 
============== ========= ================= ======== =============== ============ =========== 
05-DEC-14  SC-917  Normal Fair   1   10    10    4 
05-DEC-14  SC-917  Maharaja Standard  2   9    10    0 
05-DEC-14  SC-917  Maharaja Special  3   9    10    0 
+0

교육용입니까 제작 용입니까? 위의 최종 결과는 4 개의 우선 순위 1 석을 반환하는 것입니다. 그렇지 않습니까? – Abecee

+0

이것은 생산 용입니다. –

+0

답장을 보내 주셔서 감사합니다. RETURN_SEAT 열 값은 변경되지 않으며 AVAILABLE_SEATS 열 값만 변경해야합니다. 우선 순위 = 1 인 경우 RETURN_SEAT 값은 4입니다. 따라서이 값 (4)을 PRIORITY 1의 AVAILABLE_SEATS 값 (7)에 추가해야하지만 MAX_CAPACITY 값 (예 : 10)을 초과하면 안됩니다. 초과하면 나머지 값을 다음 PRIORITY (즉, 2)에 더하십시오. –

답변

3

아래로

그래서, 최종 결과는해야

select f.*, 
     (case when v_Num >= cumeocc - occupied 
      then greatest(v_num - (cumeocc - occupied), occupied) 
      else occupied 
     end) as new_occupied 
from (select f.*, (max_capacity-available_seats) as occupied, 
       sum(max_capacity-available_seats) over (order by priority) as cumeocc 
     from m_flight f 
    ) f; 

다음 단계는이 정보를 병합하는 것입니다. 다시. 각 행에 확실한 키가 없기 때문에 표현하기가 약간 어렵습니다. 테이블에 단일 열 기본 키를 추가하는 것이 좋습니다.

+0

도움을 주셔서 대단히 감사합니다. 이 쿼리를 실행할 때 오류가 발생했습니다. 1."ORA-00937 : 내부 그룹 쿼리가 아닌 단일 그룹 그룹 기능". Group By Function을 추가하여이 문제를 해결했습니다. \t 2. ORA-00904 : "V_NUM": 잘못된 식별자. 해결할 수 없습니다. V_NUM은 어떤 열을 나타 냅니까? –

0

이 비즈니스에 대한 업데이트 쿼리를 작성했습니다.

update M_FLIGHT d 
    set d.AVAILABLE_SEATS = 
     (select case 
       when (f.available_seats + Case 
         when ((select sum(s.return_seat) from M_FLIGHT s) - 
          nvl((select sum(s.max_capacity - s.available_seats) 
            from M_FLIGHT s 
            where s.priority < f.priority), 
            0)) > 0 THEN 
         ((select sum(s.return_seat) from M_FLIGHT s) - 
         nvl((select sum(s.max_capacity - s.available_seats) 
           from M_FLIGHT s 
           where s.priority < f.priority), 
           0)) 
         Else 
         0 
         END) >= f.max_capacity then 
        f.max_capacity 
       else 
        (f.available_seats + Case 
        when ((select sum(s.return_seat) from M_FLIGHT s) - 
         nvl((select sum(s.max_capacity - s.available_seats) 
           from M_FLIGHT s 
           where s.priority < f.priority), 
           0)) > 0 THEN 
        ((select sum(s.return_seat) from M_FLIGHT s) - 
        nvl((select sum(s.max_capacity - s.available_seats) 
          from M_FLIGHT s 
          where s.priority < f.priority), 
          0)) 
        Else 
        0 
        END) 
       end as avail_new 
      from M_FLIGHT f 
     where f.priority = d.priority); 

나는이 쿼리를 읽는 것이 어렵다는 것을 알고 있지만 작동합니다. 어쩌면 하위 쿼리 (예 : DEPARTURE_DATE, FLIGHT_NO, ...)에 필터를 추가해야 할 수 있습니다.

고맙습니다. 많은 것을 생각해야 할 문제가 있습니다. 나는 그것을 좋아.

관련 문제