Sunteți pe pagina 1din 19

UNIVERSITATEA OVIDIUS-CONSTAȚ A

Facultatea de Matematică și Informatică


Medii Virtuale Multimodale Distribuite

Sisteme avansate de baze de date

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 menține informațiile despre produs, cum ar fi numele, descrierea, costul


standard , prețul de listă , tipul categoriei. De asemenea, urmă rește informațiile de inventar
pentru toate produsele, inclusiv depozitele unde sunt disponibile produse. Deoarece
compania operează la nivel global, are depozite în diverse locații din întreaga lume.

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.

Următoarele sunt câteva dintre întrebările frecvente:

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;

e) Primul unit_price al produselor din fiecare comandă

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

Structura si analiza datelor.DW pentru urmarirea vanzarilor intr-un lant de vanzare:


-dimensiuni:produs, locatii
-masuri: cost produs

Ierarhie:
Eveniment(Fapt)
Dimensiune
Masura

Dimensional fact Model(DFM), model de fapte(evenimente) dimensionale, model grafic


care sprijina proiectarea conceptuala

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

S-ar putea să vă placă și