Documente Academic
Documente Profesional
Documente Cultură
Proiect 9
Proiect 9
Prof. Coordonator:
Lector dr. Şerban Cristina
Student:
Curpedin Mozen
Constanța
2020
Specificațiile problemei
Baza de date Oracle se bazează pe o companie fictivă globală care vinde hardware de
calculator, inclusiv stocare, placă de bază , RAM, placă video și procesor.
Compania înregistrează toate informațiile clienților, inclusiv numele, adresa și site-ul web.
Fiecare client are cel puțin o persoană de contact cu informații detaliate, nume, prenume, e-
mail și telefon. De asemenea, compania plasează o limită de credit fiecă rui client pentru a
limita suma pe care acesta o poate datora.
Ori de câ te ori un client emite o comandă de cumpă rare, se creează o comandă de vâ nzare
în baza de date cu starea de asteptare. Câ nd compania expediază comanda, starea comenzii
devine livrată . În cazul în care clientul anulează o comandă , starea comenzii devine anulată .
Pe lâ ngă informațiile despre vâ nză ri, datele angajaților sunt înregistrate cu câ teva
informații de bază , cum ar fi numele, e-mailul, telefonul, titlul postului, managerul și data
angajă rii.
a) Afisați toate comenzile începâ nd cu anul 2017 între lunile mai și septembrie care au o
valuare mai mare decâ t 200 și conțin cel putin 2 produse,și orașul livră rii incepe cu litera
‘T’ sau se termină cu litera ‘e’.
SELECT p.product_name as "Nume produs",o.status,o.order_date,oi.quantity,oi.unit_price
,loc.city
FROM products p LEFT JOIN order_items oi on p.product_id = oi.product_id
LEFT JOIN orders o on o.order_id = oi.order_id
RIGHT JOIN inventories inv on p.product_id = inv.product_id
RIGHT JOIN warehouses w on inv.warehouse_id = w.warehouse_id
RIGHT JOIN locations loc on w.location_id = loc.location_id
WHERE o.status = 'Shipped' AND EXTRACT(YEAR FROM o.order_date)>=2017 AND (EXT
RACT(MONTH from o.order_date) >= 5 AND EXTRACT(MONTH from o.order_date) <=9
)
AND (loc.city like 'T%' OR loc.city like '%e')
GROUP BY p.product_name,o.status,o.order_date,oi.quantity,oi.unit_price,loc.city
HAVING SUM(oi.quantity) >= 2 AND oi.unit_price >= 200
1
b) Numele și adresa cumparătorilor,și data la care au fost cumparate CPU-uri în primele 6 luni
ale anului 2016
SELECT DISTINCT c.name,c.address,o.order_date
FROM customers c LEFT JOIN orders o ON c.customer_id=o.customer_id
LEFT JOIN order_items oi ON o.order_id=oi.order_id
LEFT JOIN products p ON oi.product_id=p.product_id
LEFT JOIN product_categories pc ON p.category_id=pc.category_id
WHERE pc.category_name='CPU' AND EXTRACT(MONTH from o.order_date)>=1 AND E
XTRACT(MONTH from o.order_date)<=6 AND EXTRACT(YEAR from o.order_date)=2016;
2
c)Pentru ultimile 4 luni din anul 2016 afisați numele, adresa cumparatorilor, data achizitiei
și categoria componentei de tipul CPU.
SELECT DISTINCT c.name,c.address,o.order_date,pc.category_name
FROM customers c LEFT JOIN orders o ON c.customer_id=o.customer_id
LEFT JOIN order_items oi ON o.order_id=oi.order_id
LEFT JOIN products p ON oi.product_id=p.product_id
LEFT JOIN product_categories pc ON p.category_id=pc.category_id
WHERE TRIM(LOWER(pc.category_name))='cpu' AND EXTRACT(MONTH from o.order_da
te)>=9 AND EXTRACT(MONTH from o.order_date)<=12 AND EXTRACT(YEAR from o.ord
er_date)=2016;
d) Pentru fiecare componenta, calculați numarul total de piese cumpă rate în 2017
SELECT SUM(oi.quantity) “total 2017”,pc.category_name
FROM orders o LEFT JOIN order_items oi ON o.order_id=oi.order_id
LEFT JOIN products p ON oi.product_id=p.product_id
LEFT JOIN product_categories pc ON p.category_id=pc.category_id
WHERE EXTRACT(YEAR FROM o.order_date)=2017
GROUP BY pc.category_name;
SELECT p.product_name,p.standard_cost*oi.quantity
3
FROM orders o LEFT JOIN order_items oi ON o.order_id=oi.order_id
LEFT JOIN products p ON oi.product_id=p.product_id;
SELECT DISTINCT p.product_name,oi.order_id,
LAST_VALUE(oi.unit_price) IGNORE NULLS
OVER (PARTITION BY oi.product_id ORDER BY oi.unit_price) AS lowest_unit_prince_
product
FROM order_items oi LEFT JOIN products p ON oi.product_id=p.product_id;
f) Pentru fiecare zonă geografică și pentru fiecare lună , calculați totalul vâ nză rilor efectuate
pentru anul 2017.
SELECT regions.region_name, SUM((order_items.unit_price) *(order_items.quantity))
AS "Sum Column1", EXTRACT(YEAR FROM orders.order_date) as yr, EXTRACT(MONTH FROM
orders.order_date) as mon
FROM regions, orders INNER JOIN order_items ON orders.order_id = order_items.ord
er_id
WHERE EXTRACT(YEAR FROM orders.order_date) = 2017 and status = 'Shipped'
GROUP BY regions.region_name, EXTRACT(YEAR FROM orders.order_date), EXTRACT(MONTH
FROM orders.order_date)
ORDER BY regions.region_name, yr, mon
4
g)Afisați toate comenzile începâ nd cu anul 2017 între lunile mai și septembrie care au o
valuare mai mare decâ t 200 și conțin cel putin 2 produse.
SELECT p.product_name as "Nume produs",o.status,o.order_date,oi.quantity,oi.unit_price
FROM products p LEFT JOIN order_items oi on p.product_id = oi.product_id
LEFT JOIN orders o on o.order_id = oi.order_id
WHERE o.status = 'Shipped' AND EXTRACT(YEAR FROM o.order_date)>=2017 AND (EXT
RACT(MONTH from o.order_date) >= 5 AND EXTRACT(MONTH from o.order_date) <=9
)
GROUP BY p.product_name,o.status,o.order_date,oi.quantity,oi.unit_price
HAVING SUM(oi.quantity) >= 2 AND oi.unit_price >= 200
5
h) Pentru perioada iuline-decembrie 2017 extrageți numele, adreasa compă ră torilor, data
achiziției și denumirea categorieie pentru placi video.
SELECT DISTINCT c.name,c.address,o.order_date,pc.category_name
FROM customers c LEFT JOIN orders o ON c.customer_id=o.customer_id
LEFT JOIN order_items oi ON o.order_id=oi.order_id
LEFT JOIN products p ON oi.product_id=p.product_id
LEFT JOIN product_categories pc ON p.category_id=pc.category_id
WHERE TRIM(LOWER(pc.category_name))='video card' AND EXTRACT(MONTH from o.or
der_date)>=7 AND EXTRACT(MONTH from o.order_date)<=12 AND EXTRACT(YEAR fro
m o.order_date)=2017;
6
Proiectare:
Depozitul de date va stoca informații din perioada 1998-2007. Urmă toarele cardinalită ți
sunt cunoscute (să presupunem că datele sunt distribuite uniform):
Componente: ~ 300
Angajati: ~ 100
Contacti: ~ 300
Informatii cu privire la inventar pe fiecare depozit: ~ 1100
Locatii desfacere produse: ~ 20
Comenzi: ~ 100
Produse comandate: ~ 100
Depozite: ~ 10
Ierarhie:
Eveniment(Fapt)
Dimensiune
Masura
7
Cerinte:
Proiectarea depozitului de date pentru a rezolva problemele descrise.In special, datele
proiectate trebuie sa permita executarea eficenta a tuturor intrebarilor descrise in
speciticatii.
CREATE TABLE regions
(
region_id NUMBER GENERATED BY DEFAULT AS IDENTITY
START WITH 5 PRIMARY KEY,
region_name VARCHAR2( 50 ) NOT NULL
);
8
CREATE TABLE countries
(
country_id CHAR( 2 ) PRIMARY KEY ,
country_name VARCHAR2( 40 ) NOT NULL,
region_id NUMBER ,
CONSTRAINT fk_countries_regions FOREIGN KEY( region_id )
REFERENCES regions( region_id )
ON DELETE CASCADE
);
9
CREATE TABLE locations
(
location_id NUMBER GENERATED BY DEFAULT AS IDENTITY START WITH 24
PRIMARY KEY,
address VARCHAR2( 255 ) NOT NULL,
postal_code VARCHAR2( 20 ),
city VARCHAR2( 50 ),
state VARCHAR2( 50 ),
country_id CHAR( 2 ),
CONSTRAINT fk_locations_countries
FOREIGN KEY( country_id )
REFERENCES countries( country_id )
ON DELETE CASCADE
);
CREATE TABLE warehouses
(
warehouse_id NUMBER
GENERATED BY DEFAULT AS IDENTITY START WITH 10
PRIMARY KEY,
warehouse_name VARCHAR( 255 ) ,
location_id NUMBER( 12, 0 ),
CONSTRAINT fk_warehouses_locations
FOREIGN KEY( location_id )
REFERENCES locations( location_id )
ON DELETE CASCADE
);
10
CREATE TABLE employees
(
employee_id NUMBER
GENERATED BY DEFAULT AS IDENTITY START WITH 108
PRIMARY KEY,
first_name VARCHAR( 255 ) NOT NULL,
last_name VARCHAR( 255 ) NOT NULL,
email VARCHAR( 255 ) NOT NULL,
phone VARCHAR( 50 ) NOT NULL,
hire_date DATE NOT NULL,
manager_id NUMBER( 12, 0),
job_title VARCHAR( 255 ) NOT NULL,
CONSTRAINT fk_employees_manager
FOREIGN KEY( manager_id )
REFERENCES employees( employee_id )
ON DELETE CASCADE
);
11
CREATE TABLE product_categories
(
category_id NUMBER
GENERATED BY DEFAULT AS IDENTITY START WITH 6
PRIMARY KEY,
category_name VARCHAR2( 255 ) NOT NULL
);
12
CREATE TABLE products
(
product_id NUMBER
GENERATED BY DEFAULT AS IDENTITY START WITH 289
PRIMARY KEY,
product_name VARCHAR2( 255 ) NOT NULL,
description VARCHAR2( 2000 ),
standard_cost NUMBER( 9, 2 ),
list_price NUMBER( 9, 2 ),
category_id NUMBER NOT NULL,
CONSTRAINT fk_products_categories
FOREIGN KEY( category_id )
REFERENCES product_categories( category_id )
ON DELETE CASCADE
);
13
CREATE TABLE customers
(
customer_id NUMBER
GENERATED BY DEFAULT AS IDENTITY START WITH 320
PRIMARY KEY,
name VARCHAR2( 255 ) NOT NULL,
address VARCHAR2( 255 ),
website VARCHAR2( 255 ),
credit_limit NUMBER( 8, 2 )
);
CREATE TABLE contacts
(
contact_id NUMBER
GENERATED BY DEFAULT AS IDENTITY START WITH 320
PRIMARY KEY,
first_name VARCHAR2( 255 ) NOT NULL,
last_name VARCHAR2( 255 ) NOT NULL,
email VARCHAR2( 255 ) NOT NULL,
phone VARCHAR2( 20 ),
customer_id NUMBER,
CONSTRAINT fk_contacts_customers
FOREIGN KEY( customer_id )
REFERENCES customers( customer_id )
ON DELETE CASCADE
);
14
CREATE TABLE orders
(
order_id NUMBER
GENERATED BY DEFAULT AS IDENTITY START WITH 106
PRIMARY KEY,
customer_id NUMBER( 6, 0 ) NOT NULL,
status VARCHAR( 20 ) NOT NULL ,
salesman_id NUMBER( 6, 0 ),
order_date DATE NOT NULL,
CONSTRAINT fk_orders_customers
FOREIGN KEY( customer_id )
REFERENCES customers( customer_id )
ON DELETE CASCADE,
CONSTRAINT fk_orders_employees
FOREIGN KEY( salesman_id )
REFERENCES employees( employee_id )
ON DELETE SET NULL
);
15
CREATE TABLE order_items
(
order_id NUMBER( 12, 0 ),
item_id NUMBER( 12, 0 ),
product_id NUMBER( 12, 0 ) NOT NULL,
quantity NUMBER( 8, 2 ) NOT NULL,
unit_price NUMBER( 8, 2 ) NOT NULL,
CONSTRAINT pk_order_items
PRIMARY KEY( order_id, item_id ),
CONSTRAINT fk_order_items_products
FOREIGN KEY( product_id )
REFERENCES products( product_id )
ON DELETE CASCADE,
16
CONSTRAINT fk_order_items_orders
FOREIGN KEY( order_id )
REFERENCES orders( order_id )
ON DELETE CASCADE
);
17
CREATE TABLE inventories
(
product_id NUMBER( 12, 0 ),
warehouse_id NUMBER( 12, 0 ),
quantity NUMBER( 8, 0 ) NOT NULL,
CONSTRAINT pk_inventories
PRIMARY KEY( product_id, warehouse_id ),
CONSTRAINT fk_inventories_products
FOREIGN KEY( product_id )
REFERENCES products( product_id )
ON DELETE CASCADE,
CONSTRAINT fk_inventories_warehouses
FOREIGN KEY( warehouse_id )
REFERENCES warehouses( warehouse_id )
ON DELETE CASCADE
);
18