#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, отсюда и составные первичные ключи. Я покажу ваш запрос в следующем комментарии. С уважением