oracle中当订单按照先后顺序,当订单金额达到一定金额时如何把订单记录取出?
如下图:比如如何分别取出按照货物名称汇总订单金额,当订单金额达到5万的最先销售的订单记录,并在记录后添加一列标志(达标标志):比如:铅笔达标订单(橡皮达标订单等等)
订单日期 订单时间 订单客户 订单货物名称 订单金额 销售员工工号
20171101 95832 张明 笔记本 500 21333
20171110 102015 王红 铅笔 300 21333
20171110 102118 李明 铅笔 600 25154
20171118 121548 张正 铅笔 500 21333
20171212 153558 丁来 橡皮 600 22565
20171212 153858 丁来 铅笔 125 22565
20171213 153558 沈丁 橡皮 600 22565
最后需要字段:订单日期 订单时间 订单客户 订单货物名称 订单金额 销售员工工号 达标标志
说明:意思是在历史订单表中,统计某个货物的销售金额达到5万时候,按照时间先后顺序,将已经产生销售的订单记录取出,对这部分产生订单的员工奖励。
可以使用对象循环获取订单记录
应该在订单产生时做被动响应 避免长时间循环 查询
在订单产生时进行订单金额统计 超过5W的 记录这个订单日期和时间 这俩字段 然后对订单进行按时间排序 时间大于等于 稍微处理过的订单时间
这样就是你要结果了
--取出所有达标
SELECT 订单日期, 订单时间, 订单客户, 订单货物名称, 订单金额, 销售员工工号, 达标标志, 订单货物名称 || '达标'
FROM 表名
WHERE 订单金额 >= 50000
--取每个货物最先销售且达50000订单
SELECT *
FROM (SELECT 订单日期, 订单时间, 订单客户, 订单货物名称, 订单金额, 销售员工工号, 达标标志, 订单货物名称 || '达标', row_number() over(PARTITION BY 货物id/货物名称 ORDER BY 订单日期) rand
FROM 表名
WHERE 订单金额 >= 50000)
WHERE rand = 1
文字部分替换成相应的字段 和 表名
用case语句做查询
这个使用触发器就很容易实现。通过触发器动态的查询更新同种类型商品的总值
如果达到预期目标,就将记录更新到对应的表中。
之后配合后台轮询,可以及时的获取到达标的先后顺序和具体的金额。
for i in (select 订单货物名称 from 表 where 标识 IS NULL group by 订单货物名称 HAVING SUM(金额)>= 50000)
loop
update 表 set 标识 = 订单货物名称||'达标' where 订单货物名称 = i.订单货物名称 and 标识 IS NULL;
end loop;
select sum(订单金额),订单货物名称,订单时间 from table group by 订单货物名称,订单时间
select * from (
select sum(订单金额) 订单金额,订单货物名称,订单时间 from table group by 订单货物名称,订单时间 order by 订单时间 desc
) where 订单金额>5000
用游标实现,请看如下demo:
create sequence sales_Id_seq increment by 1 start with 1;
--原始数据
create table sales(
id int primary key ,
orderDate char(8),
orderTime char(6),
customer varchar(100),
goods varchar(200), sales int,
saler varchar(10)
);
--存放首先达到要求的结果数据,可以根据情况选择列
create table Excel_Result_Sales(
id int primary key ,
orderDate char(8),
orderTime char(6),
customer varchar(100),
goods varchar(200), sales int,
saler varchar(10)
);
--测试数据
insert into sales values(sales_Id_seq.nextval,'20171101','090101','张三','笔记本',5000,'0001');
insert into sales values(sales_Id_seq.nextval,'20171101','090111','李四','铅笔',15000,'0002');
insert into sales values(sales_Id_seq.nextval,'20171101','090112','李四','铅笔',15000,'0002');
insert into sales values(sales_Id_seq.nextval,'20171101','090113','李四','铅笔',15000,'0003');
insert into sales values(sales_Id_seq.nextval,'20171101','090114','李四','橡皮',15000,'0004');
insert into sales values(sales_Id_seq.nextval,'20171101','090115','王五','铅笔',15000,'0002');
insert into sales values(sales_Id_seq.nextval,'20171101','090115','王五','铅笔',15000,'0002');
insert into sales values(sales_Id_seq.nextval,'20171101','100115','赵生','画册',35000,'0002');
declare cursor c_sales is
select id,orderDate,orderTime,goods,sales from sales order by orderDate, orderTime;
c_row c_sales%rowtype;
sale_sum int;
begin
for c_row in c_sales loop
select sum(sales) into sale_sum from sales where goods= c_row.goods and orderDate||orderTime<=c_row.orderDate||c_row.orderTime;
if sale_sum >=5000 then
insert into Excel_Result_Sales
select * from sales where goods= c_row.goods and orderDate||orderTime<=c_row.orderDate||c_row.orderTime;
exit;
end if;
end loop;
end;
--查看结果
select * from Excel_Result_Sales
--把销售额达到5万的产品订单取出,按时间排序。
select * from 订单 where 订货名称 in (
select 订单货物名称 from(
select 订单货物名称, sum(订单金额) 销售额 from 订单
where 1=1
group by 订单货物名称
) where 销售额 > 50000)
order by 订单日期,订单时间,订单货物名称