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