Создание ежемесячного отчета по заказу клиента - PullRequest
0 голосов
/ 25 апреля 2019

Отчет должен содержать следующую информацию: имя клиента, полный адрес, старый баланс, новый баланс и количество товаров, которые были заказаны этим клиентом в течение этого периода (31 марта 2019 года). При условии, что показанные текущие остаткиправильный по состоянию на конец февраля 2019 года.

Это то, что я пробовал до сих пор, он просто отображает заказы за тот месяц, но у меня возникли проблемы, включая старый баланс и новый баланс вопросов.Я чувствую, что это все еще далеко от того, что требуется.

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 Ответ

1 голос
/ 25 апреля 2019

У вашей модели данных есть серьезные проблемы.

Баланс - это обычно сумма денег.Однако, хотя ваша таблица order_item имеет значение qty, связанных с этим затрат нет.Следовательно, невозможно рассчитать новый баланс на основе предоставленных данных структур.Кажется, у вас отсутствует таблица - item?- который имеет эту важную информацию.

Кроме того, бессмысленно иметь концепцию «текущего» баланса без какого-либо представления о том, когда этот баланс последний раз рассчитывался.Мы просто должны знать, что это было "правильно на конец февраля 2019 года" .

Кроме того, использование таких вещей, как 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...