sql - 如何在PL/SQL中正确解决这个问题?

标签 sql oracle

利用 Outdoor Clubs & Product 数据库创建一个 PL/SQL 匿名 block 程序单元,其中列出了product_name 属性值和需求状态文本显示。需求状态文本显示是通过计算迄今为止订购产品的次数来确定的。需求状态文本显示将为“低需求”或“高需求”。如果该产品的订购次数少于 2 次,则会显示低需求。如果该产品已被订购超过 2 次,则会显示高需求。问题延伸:由于不上架低需求产品的业务规则,将低需求产品的价格降低(1美元)。

我知道我的代码是错误的,因为它甚至无法运行,但我只是对此感到困惑。

设置服务器输出 清晰的屏幕 宣布 产品名称字符串; 需求状态字符串; 开始 从产品中选择产品名称到产品名称中; 从order_details中选择product_id到demand_status中; dbms_output.put_line('产品名称' || '需求状态'); dbms_output.put_line('------------' || '----------------'); dbms_output.put_line(产品名称 || 需求状态); 结束;

结果应该如下所示:

Product Name             Demand Status
------------             -------------
Beginner's Ski Boot      Low Demand
Intermediate Ski Boot    High Demand
Pro Ski Boot             Low Demand
Beginner's Ski Pole      Low Demand
Intermediate Ski Pole    Low Demand
Pro Ski Pole             High Demand
Road Bicycle             Low Demand
Mountain Bicycle         Low Demand
Tire Pump                Low Demand
Water Bottle             High Demand
Bicycle Tires            Low Demand
Bicycle Helmet           Low Demand

Order_Details table Product table

这是数据库表的代码:

drop table order_details;
drop table product_order;
drop table club_membership;
drop table purchase_order;
drop table product;
drop table customer;
drop table club_activity;
drop table sporting_clubs;
drop table supplier;

drop sequence club_sequence;
drop sequence product_id_sequence;
drop sequence customer_sequence;
drop sequence membership_sequence;
drop sequence product_order_sequence;
drop sequence supplier_sequence;
drop sequence po_sequence;

create table sporting_clubs
(club_id number(3)constraint sporting_clubs_pk primary key,
name varchar2(30),
street varchar2(30),
city varchar2(15),
state char(2),
zip number(5),
phone varchar2(10));

create table club_activity
(club_id number(3)constraint club_activity_fk references sporting_clubs,
activity varchar2(15),
constraint club_activity_pk primary key (club_id,activity));

create table supplier
(supplier_id varchar2(4) constraint supplier_pk primary key,
name varchar2(30),
street varchar2(30),
city varchar2(15),
state char(2),
zip number(5),
phone varchar2(10));

create table product
(product_id number(5) constraint product_pk primary key,
product_name varchar2(30),
quantity_in_stock number(3),
reorder_point number(2),
price number(5,2),
supplier_id varchar2(4) constraint product_fk references supplier,
reorder_qty number(2));

create table purchase_order
(po_no varchar2(4) constraint purchase_order_pk primary key,
po_date date,
product_id number(5) constraint purchase_order_fk1 references product,
quantity number(3),
supplier_id varchar2(4) constraint purchase_order_fk2 references supplier);

create table customer
(customer_id number(3) constraint customer_pk primary key,
first_name varchar2(10),
last_name varchar2(10),
street varchar2(30),
city varchar2(15),
state char(2)default 'MO',
zip number(5),
phone varchar2(10));

create table club_membership
(membership_id number(5) constraint club_membership_pk primary key,
membership_date date,
duration number(2),
amount number(4),
payment_type varchar2(5)constraint membership_payment_type_ck check ((payment_type = 'CC') or (payment_type = 'Check')),
club_id number(3) constraint club_membership_fk1 references sporting_clubs,
customer_id number(3) constraint club_membership_fk2 references customer);

create table product_order
(order_id number(4) constraint product_order_pk primary key,
order_date date,
ship_date date,
payment_type varchar2(5)constraint prod_order_payment_type_ck check ((payment_type = 'CC') or (payment_type = 'Check')),
total number (6,2),
customer_id number(3) constraint product_order_fk1 references customer);

create table order_details
(order_id number(4),
product_id number(5),
quantity number(2),
constraint order_details_pk primary key (order_id,product_id),
constraint order_details_fk1 foreign key (order_id) references product_order,
constraint order_details_fk2 foreign key (product_id) references product);


create sequence club_sequence
start with 100
increment by 10
nocache;

insert into sporting_clubs
values(club_sequence.nextval, 'Hillside Mountain Club', '1 Winona St','Wichita','KS',34342,'3163997676');
insert into sporting_clubs
values(club_sequence.nextval, 'Branson Climbing Club', '2 Sherwood Dr.','Branson','MO',65670,'4174485676');
insert into sporting_clubs
values(club_sequence.nextval, 'Cherokee Rafting Club', '44 Kent Ave.','St. Charles','MO',66572,'3147780870');
insert into sporting_clubs
values(club_sequence.nextval, 'White Plains Club', '225 Tracy St.','New York','NY',13567,'2126678090');

insert into club_activity
values(100,'Hiking');
insert into club_activity
values(100,'Climbing');
insert into club_activity
values(100,'Walking');
insert into club_activity
values(110,'Hiking');
insert into club_activity
values(110,'Climbing');
insert into club_activity
values(110,'Conservation');
insert into club_activity
values(110,'Walking');
insert into club_activity
values(120,'Conservation');
insert into club_activity
values(120,'Canoeing');
insert into club_activity
values(130,'Conservation');
insert into club_activity
values(130,'Canoeing');
insert into club_activity
values(130,'Walking');

create sequence supplier_sequence
start with 500
increment by 10
nocache;

insert into supplier
values('S'||supplier_sequence.nextval,'Hillside Ski','2717 S. Western Ave.','Los Angeles','CA',90006,'7146654959');
insert into supplier
values('S'||supplier_sequence.nextval,'Tiger Mountain','2600 S. Vermont Ave.','Los Angeles','CA',90006,'7143327878');
insert into supplier
values('S'||supplier_sequence.nextval,'Asha Outdoor','44 S. LaSalle St.','Chicago','IL',60603,'3125554678');
insert into supplier
values('S'||supplier_sequence.nextval,'Sheraton Recreation','225 Tracy St.','New York','NY',13567,'2128889569');


create sequence product_id_sequence
start with 10010
increment by 1
nocache;

insert into product
values(product_id_sequence.nextval,'Beginner''s Ski Boot',20,5,9.75,'S500',25);
insert into product
values(product_id_sequence.nextval,'Intermediate Ski Boot',18,5,12.99,'S500',20);
insert into product
values(product_id_sequence.nextval,'Pro Ski Boot',21,7,15.49,'S510',25);
insert into product
values(product_id_sequence.nextval,'Beginner''s Ski Pole',15,3,25.49,'S500',20);
insert into product
values(product_id_sequence.nextval,'Intermediate Ski Pole',20,3,29.99,'S520',22);
insert into product
values(product_id_sequence.nextval,'Pro Ski Pole',21,5,34.99,'S530',25);
insert into product
values(product_id_sequence.nextval,'Road Bicycle',15,4,34.95,'S520',18);
insert into product
values(product_id_sequence.nextval,'Mountain Bicycle',19,4,49.99,'S520',20);
insert into product
values(product_id_sequence.nextval,'Tire Pump',8,2,7.99,'S530',10);
insert into product
values(product_id_sequence.nextval,'Water Bottle',25,4,2.49,'S510',25);
insert into product
values(product_id_sequence.nextval,'Bicycle Tires',30,5,4.99,'S500',33);
insert into product
values(product_id_sequence.nextval,'Bicycle Helmet',23,6,10.95,'S510',25);

create sequence po_sequence
start with 11
nocache;

insert into purchase_order
values('PO'||po_sequence.nextval,to_date('5/25/12','mm/dd/yy'),10011,20,'S500');
insert into purchase_order
values('PO'||po_sequence.nextval,to_date('5/12/12','mm/dd/yy'),10015,25,'S530');
insert into purchase_order
values('PO'||po_sequence.nextval,to_date('6/25/12','mm/dd/yy'),10011,20,'S500');
insert into purchase_order
values('PO'||po_sequence.nextval,to_date('6/15/12','mm/dd/yy'),10018,10,'S530');
insert into purchase_order
values('PO'||po_sequence.nextval,to_date('7/10/12','mm/dd/yy'),10015,25,'S530');
insert into purchase_order
values('PO'||po_sequence.nextval,to_date('7/25/12','mm/dd/yy'),10019,25,'S510');


create sequence customer_sequence
start with 101
nocache;

insert into customer
values(customer_sequence.nextval,'Jack','Russell','25 North Madison Ave.','Springfield','MO',65807,'4178823434');
insert into customer
values(customer_sequence.nextval,'Betty','Trumbell','550 South Court Dr.','St. Louis','MO',63140,'3125556670');
insert into customer
values(customer_sequence.nextval,'Anil','Kaul','400 South Circle St.','Kansas City','MO',64530,'4316667070');
insert into customer
values(customer_sequence.nextval,'Tom','Wiley','1500 North Grand St.','Springfield','MO',65810,'4178825560');
insert into customer
values(customer_sequence.nextval,'Sharon','Stone','200 West Wagner St.','Springfield','MO',65807,'4176668890');

create sequence membership_sequence
start with 10010
increment by 10
nocache;

insert into club_membership
values(membership_sequence.nextval,to_date('6/12/12','mm/dd/yy'),4,200,'CC',100,101);
insert into club_membership
values(membership_sequence.nextval,to_date('6/15/12','mm/dd/yy'),2,100,'Check',110,102);
insert into club_membership
values(membership_sequence.nextval,to_date('6/21/12','mm/dd/yy'),5,250,'Check',120,103);

create sequence product_order_sequence
start with 1001
nocache;

insert into product_order
values(product_order_sequence.nextval,to_date('5/27/12','mm/dd/yy'),to_date('6/1/12','mm/dd/yy'),'CC',134.95,102);
insert into product_order
values(product_order_sequence.nextval,to_date('5/28/12','mm/dd/yy'),to_date('6/2/12','mm/dd/yy'),'CC',134.85,103);
insert into product_order
values(product_order_sequence.nextval,to_date('5/28/12','mm/dd/yy'),to_date('6/3/12','mm/dd/yy'),'Check',12.45,104);
insert into product_order
values(product_order_sequence.nextval,to_date('6/5/12','mm/dd/yy'),to_date('6/10/12','mm/dd/yy'),'CC',44.43,105);
insert into product_order
values(product_order_sequence.nextval,to_date('6/6/12','mm/dd/yy'),to_date('6/8/12','mm/dd/yy'),'Check',52.48,103);
insert into product_order
values(product_order_sequence.nextval,to_date('6/8/12','mm/dd/yy'),to_date('6/12/12','mm/dd/yy'),'CC',131.94,104);


insert into order_details values(1001,10011,2);
insert into order_details values(1001,10015,3);
insert into order_details values(1002,10011,5);
insert into order_details values(1002,10016,2);
insert into order_details values(1003,10019,5);
insert into order_details values(1004,10018,3);
insert into order_details values(1004,10011,1);
insert into order_details values(1004,10019,3);
insert into order_details values(1005,10017,1);
insert into order_details values(1005,10019,1);
insert into order_details values(1005,10021,1);
insert into order_details values(1006,10012,4);
insert into order_details values(1006,10015,2);

commit;

最佳答案

首先,您必须计算每种产品的订单数。这样您就可以将两个表连接起来,按产品对结果进行分组。

select product_name
       ,count(1) as cnt_orders
from product p
join order_details o on p.product_id = o.product_id
group by p.product_name;

使用计数器列,您可以获得“低需求”或“高需求”值。例如 case when t.cnt_orders < 2 then 'Low' else 'High' end as "Demand status"

最后,您迭代结果并可以打印结果。这是一种可以做到的方法。这不涵盖扩展问题,它只是打印一个列表,如您的示例中所示。

BEGIN
  dbms_output.put_line(RPAD('Product name',28,' ') || 'Demand status');
  dbms_output.put_line('------------' || '--------------');
  for rec in (select t.product_name
                    ,case
                       when t.cnt_orders < 2 then
                        'Low'
                       else
                        'High'
                     end as DemandStatus              
                from (select product_name
                            ,count(1) as cnt_orders
                        from product p
                        left join order_details o on p.product_id = o.product_id
                       group by p.product_id
                               ,p.product_name
                       order by p.product_id) t)
  LOOP

    dbms_output.put_line(RPAD(rec.product_name,28,' ') || rec.DemandStatus);

  END LOOP;

END;
/



dbms_output:
Product name                Demand status
------------                --------------
Beginner's Ski Boot         Low
Intermediate Ski Boot       High
Pro Ski Boot                Low
Beginner's Ski Pole         Low
Intermediate Ski Pole       Low
Pro Ski Pole                High
Road Bicycle                Low
Mountain Bicycle            Low
Tire Pump                   Low
Water Bottle                High
Bicycle Tires               Low
Bicycle Helmet              Low
> 

db<> fiddle here

关于sql - 如何在PL/SQL中正确解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58088869/

相关文章:

mysql - SUM(MAX( ) + MAX( )) 怎么做?

mysql - 通过在 MYSQl 中更新其值来插入重复行

sql - Oracle查询以树的形式获取数据

java - 解析函数不起作用

sql - 计算sql查询中的持续时间总和

sql - Teradata 确定一年的第一天

php - 向mysql数据库插入多行

sql - 如何使用 oracle 查询获取最后一个和倒数第二个日期

mysql - 如何在不使用子查询的情况下按最小日期计算新用户?

database - SYSDATE 更改会影响 Oracle 中的表统计信息吗?