【问题标题】:How to do this problem properly in PL/SQL?如何在 PL/SQL 中正确解决这个问题?
【发布时间】:2020-10-02 06:32:02
【问题描述】:

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

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

set serveroutput on clear screen declare product_name string; demand_status string; begin select product_name into product_name from product; select product_id into demand_status from order_details ; dbms_output.put_line('Product name' || 'Demand status'); dbms_output.put_line('------------' || '--------------'); dbms_output.put_line(product_name || demand_status); end;

结果应该是这样的:

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;

【问题讨论】:

  • 请不要发布代码或数据的图片。如果有人想解决您的问题,期望有人重新键入所有内容有点过分。相反,将代码和数据作为文本发布。此外,了解如何格式化文本以使其可读 - see this page。谢谢。
  • 我已经添加了数据库表代码来为任何想要帮助解决这个问题的人实现代码,对 Bob 感到抱歉

标签: sql oracle


【解决方案1】:

首先,您必须计算每个产品的订单数量。这样您就可以将两个表加入到按产品分组的结果中。

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_输出: 产品名称 需求状况 ------------ -------------- 初学者滑雪靴低帮 中级滑雪靴高 专业滑雪靴低 初学者滑雪杆低 中级滑雪杆低 专业滑雪杆高 公路自行车低 山地自行车低 轮胎泵低 水瓶高 自行车轮胎低 自行车头盔低 >

db小提琴here

【讨论】:

    【解决方案2】:
    declare
    cursor p_cur is
    select product_id, product_name
    from product;
    p_row p_cur%rowtype;
    product_count integer;
    pname char(25);
    begin
    dbms_output.put_line('Product Name             Demand Status');
    dbms_output.put_line('------------             -------------');
    for p_row in p_cur
    loop
    select count(*) into product_count
    from order_details
    where product_id = p_row.product_id;
    pname := p_row.product_name;
    if product_count < 2 then
    dbms_output.put_line(pname||'Low Demand');
    update product
    set price = price - 1
    where product_id = p_row.product_id;
    else
    dbms_output.put_line(pname||'High Demand');
    end if;
    end loop;
    end;
    

    【讨论】:

    • 欢迎来到 Stack Overflow。 Stack Overflow 上不鼓励仅使用代码的答案,因为它们没有解释它是如何解决问题的。请编辑您的答案,以解释此代码的作用以及它如何改进这个老问题的现有答案,以便它对 OP 以及其他有类似问题的用户有用。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多