[英]Creating a customer-order monthly report
该报告必须包含以下信息:客户的姓名,完整地址,旧余额,新余额以及该客户在该期间(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';
这些是我正在使用的表
甲骨文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)
);
每个客户只能在结果中包含一次(即,一行),并且结果必须按照帐号的升序排列。
您的数据模型存在严重问题。
余额通常是一笔钱。 但是,尽管您的order_item
表具有qty
但没有相关的成本。 因此,不可能从提供的数据结构中计算新的余额。 看来您缺少表item
? -具有重要信息。
同样,毫无意义的是“当前”余额的概念,而没有任何关于上一次计算该余额的时间的概念。 我们只是应该知道它“截至2019年2月底是正确的” 。
同样,将customer.name
类的东西用作主键也很糟糕。 主键应该是不变的,人们经常更改其名称。
最后,用Oracle关键字(例如"order"
和"date"
作为名称是很难说的。 不要强迫人们用双引号将对象名称引起来。 只是不要。 选择明智的名称。
无论如何,让我们开始工作:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.