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