该报告必须包含以下信息:客户的姓名,完整地址,旧余额,新余额以及该客户在该期间(2019年3月31日)已订购的商品数量。假设显示的是当前余额截至2019年2月底。
这是我到目前为止尝试过的方法,它只显示该月的订单,但是我遇到了麻烦,包括问题的旧余额和新余额。我觉得离要求还差得远。
select c.name, c.address, c.balance, i.qty
from customer c, "order" o, order_item i
where o."date" <='31-Mar-2019';
这些是我正在使用的表
oracle sql
create table customer (
name varchar(100) primary key,
address varchar(200),
balance integer);
create table "order" (
order_no number primary key,
"date" date,
cust varchar(100),
foreign key(cust) references customer(name));
create table order_item (
order_no number,
item_name varchar(100),
qty number,
primary key (order_no,item_name),
foreign key(order_no) references "order"(order_no)
);
每个客户只能在结果中(即,一行)包含一次,并且结果必须按照帐号的升序排列。
答案 0 :(得分:1)
您的数据模型存在严重问题。
余额通常是一笔金额。但是,尽管您的order_item
表中有一个qty
,但是没有相关的成本。因此,不可能从提供的数据结构中计算新的余额。似乎您有一个丢失的表-item
? -该信息至关重要。
此外,无所谓“当前”余额的概念是毫无意义的,而没有任何关于上一次计算该余额的时间的概念。我们只是应该知道它是“截至2019年2月底正确无误” 。
此外,将customer.name
之类的东西用作主键也很糟糕。主键应该是不变的,人们经常更改其名称。
最后,使用"order"
和"date"
之类的Oracle关键字来命名是很难说的。不要强迫人们用双引号将对象名称引起来。只是不要。改为选择明智的名称。
无论如何,让我们开始工作吧:
select c.name
, c.address
, c.balance as current_balance
, sum(oi.qty) as total_items_ordered
, c.balance + (oi.qty * i.price) as new_balance
from customer c
join "order" o on o.cust = c.name
join order_item oi on oi.order_no = o.order_no
join supplier i on i.name = oi.item_name
where o."date" <='31-Mar-2019'
group by c.name
, c.address
, c.balance;