创建客户订单每月报告

时间:2019-04-25 00:40:36

标签: sql oracle

该报告必须包含以下信息:客户的姓名,完整地址,旧余额,新余额以及该客户在该期间(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)
);   

每个客户只能在结果中(即,一行)包含一次,并且结果必须按照帐号的升序排列。

1 个答案:

答案 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;