Создание ежемесячного отчета по заказу клиента

#sql #oracle

#sql #Oracle

Вопрос:

Отчет должен содержать следующую информацию: имя клиента, полный адрес, старый баланс, новый баланс и количество товаров, которые были заказаны этим клиентом в течение этого периода (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. Подсказка: JOIN / ON .

2. Я полагаю, c.balance в текущем запросе указан текущий баланс? Какие правила для создания остатков, которые вы хотите?

3. непонятно ….. столбец баланса таблицы customer …… как управлять данными этого столбца

Ответ №1:

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

Баланс обычно представляет собой сумму денег. Однако, хотя в вашей 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;
  

Комментарии:

1. Спасибо за вашу помощь, я понимаю ваши вопросы, отсутствующая таблица, на которую вы ссылаетесь, — это таблица поставщика, в ней указаны следующие сведения.. «sql создает таблицу поставщик (переменная имени (100), переменная номенклатуры (100), плавающая цена (10), первичный ключ (имя, номенклатура), );

2. Я полагаю, что лектор использовал ключевые слова Oracle, чтобы сбить студентов с толку. Что касается проблемы с первичными ключами, нам не разрешено иметь первичные ключи, такие как числа / integers, отсюда и составные первичные ключи. Я покажу ваш запрос в следующем комментарии. С уважением