繁体   English   中英

创建客户订单月度报告

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM