【问题标题】:Creating a customer-order monthly report创建客户订单月度报告
【发布时间】:2019-04-25 00:40:36
【问题描述】:

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

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

【问题讨论】:

  • 提示:JOIN/ON.
  • 我猜c.balance在当前查询中是当前余额?生成你想要的余额的规则是什么?
  • 不清楚......客户表的余额栏......如何管理该栏的数据

标签: sql oracle


【解决方案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;

【讨论】:

  • 感谢您的帮助,我理解您的问题,您所指的缺失表是供应商表,它具有以下详细信息.. ``sql create table supplier( name varchar(100 ), item varchar (100), price float(10), 主键(name,item), );
  • 我相信讲师使用 Oracle 关键字是一种让学生失望的方法。在主键问题上,我们不允许有主键,例如数字/整数,因此是复合主键。我将在下一条评论中显示您的查询。亲切的问候
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 2015-09-16
  • 2012-04-18
相关资源
最近更新 更多