Oracle SQL查询,根据优先级将值分配到不同的行中

Oracle SQL查询,根据优先级将值分配到不同的行中,sql,oracle,Sql,Oracle,我想写一个SQL查询,它根据优先级将值分配或添加到不同的行中 这是我的设想 我有一张名为M_FLIGHT的表格,上面有以下数据 DEPARTURE_DATE FLIGHT_NO FAIR_TYPE PRIORITY AVAILABLE_SEATS MAX_CAPACITY RETURN_SEAT ============== ========= ================= ======== =============== ============

我想写一个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值中,以使其不超过该公平类型的最大容量值

如果超过,则将剩余值添加到下一个优先级I.e到下一个公平类型

因此,最终结果应如下所示

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

您可以使用累积和计算占用的空间:

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新座位:

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;

然后下一步是合并这些信息。这有点难以表达,因为每一行上都没有明显的键。我建议您向表中添加一个单列主键。

我为此业务编写了一个更新查询

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);
我知道这很难理解这个问题,但它是有效的。也许您需要为子查询添加一些过滤器,如起飞日期、航班号等


谢谢你提出一些需要深思熟虑的问题。我喜欢。

这是为了教育还是为了制作?以上的最终结果是返回四个优先1座位,不是吗?这是为了生产目的。谢谢您的回复。RETURN\u SEAT列值将保持不变,只有可用的\u SEAT列值应更改。对于优先级=1,返回座位值为4。因此,我们需要将此值4添加到优先级1的可用座位值7中,但不应超过最大容量值I.e 10,如果超过,则将剩余值添加到下一优先级I.e 2中。例如:对于优先级=1,在4个可用座位中,最多可以添加3个,因此剩余值为1。对于优先级=2,因为剩余值为1。我们必须将剩余值1添加到可用座位8中,因此剩余值为0。对于优先级=3,因为剩余值为0。不需要添加,因为它保持不变。非常感谢您的帮助。当我执行这个查询时,我得到了以下错误。1.ORA-00937:内部子查询没有单个组函数。我通过添加“按函数分组”来纠正这个问题。2.ORA-00904:V_NUM:无效标识符。我无法解决这个问题。V_NUM指的是哪一列?