Zadanie 29.

Stwórz zapytanie, które pokaże nam najczęściej zamawiane produkty. Wybierz 15 najczęściej zamawianych produktów. (Uwaga: więcej niż jeden produkt może być zamówiony daną ilość razy)

Schemat: OE, Tabela: Order_Items, Kolumny: order_id, product_id, Wynik: 16 rows

p29

 

 

 

 

 

Rozwiązanie

SELECT product_id, COUNT(order_id) AS Orders
FROM order_items
GROUP BY product_id
ORDER BY COUNT(order_id) DESC
FETCH FIRST 15 rows WITH ties;

[collapse]

Zadanie 9.

Znajdź produkty, których cena jest wyższa niż średnia cena z ich kategorii.

Schemat: OE, Tabela: Product_Information, Kolumny: product_id, product_name, category_id, list_price, Wynik: 91 rows

s9

 

 

 

Rozwiązanie

SELECT pi1.product_id, pi1.product_name, pi1.category_id, pi1.list_price
FROM product_information pi1
WHERE pi1.list_price > (
SELECT AVG(pi2.list_price)
FROM product_information pi2
WHERE pi1.category_id = pi2.category_id
GROUP BY pi2.category_id)
ORDER BY pi1.category_id, pi1.list_price;

[collapse]

Zadanie 8.

Napisz kwerendę, która zwróci listę nazwisk, które noszą zarówno klienci, jak i pracownicy.

Schemat: OE, HR, Tabele: Employees, Customers, Kolumny: cust_last_name, last_name, Wynik: 6 rows

s8

 

 

 

 

Rozwiązanie

1. Z operatorem INTERSECT:

SELECT DISTINCT last_name FROM HR.employees
INTERSECT
SELECT cust_last_name FROM customers;

2. Z użyciem EXISTS:

SELECT DISTINCT last_name FROM HR.employees
WHERE EXISTS (
SELECT cust_last_name
FROM customers
WHERE HR.employees.last_name = customers.cust_last_name );

[collapse]

Zadanie 7.

Stwórz kwerendę, która zliczy niepowtarzające się nazwiska klientów. W wyniku chcemy uzyskać konkretną liczbę. Zadanie rozwiąż na co najmniej dwa sposoby.

Schemat: OE, Tabela: Customers, Kolumny: cust_last_name, Wynik: 176 rows

s7

 

Rozwiązanie

1. Z klauzulą WITH:

WITH Lname AS
(
SELECT DISTINCT cust_last_name
FROM customers
)

SELECT COUNT(*) as LAST_NAME_COUNT FROM Lname;

2. Z podzapytaniem w klauzuli WHERE:

SELECT COUNT(*) as LAST_NAME_COUNT
FROM (
SELECT DISTINCT cust_last_name
FROM customers
);

3. Z grupowaniem:

SELECT COUNT(DISTINCT cust_last_name) AS last_name_count, 1
FROM customers
GROUP BY 1;

[collapse]

Zadanie 6.

Utwórz widok Order_Summary, który będzie zawierał informacje o zamówieniach: ID zamówienia, datę (bez części godzinowej), tryb złożenia zamówienia, łączną wartość, produkty, ich ilość i cenę jednostkową.

Schemat: OE, Tabele: Order_Items, Orders, Kolumny: order_id, order_mode, order_date, order_total, product_id, quantity, unit_price, Wynik: 665 rows

s6

 

 

Rozwiązanie


CREATE OR REPLACE VIEW Order_Summary
AS
SELECT order_id, o.order_mode, TO_CHAR(o.order_date, 'DD.MM.YYYY') AS order_date,
o.order_total, oi.product_id, oi.quantity, oi.unit_price
FROM orders o
INNER JOIN order_items oi USING(order_id);

SELECT * FROM order_summary;

[collapse]

Zadanie 5.

Którzy dostawcy dostarczają produkty zamówień złożonych przez klientów o ID 107 i 149? Zadanie rozwiąż na dwa sposoby.

Schemat: OE, Tabele: Product_Information, Order_Items, Orders, Kolumny: supplier_id, order_id, product_id, Wynik: 32 rows

s5

 

 

 

 

 

Rozwiązanie

1. Łączenie tabel:

SELECT DISTINCT pi.supplier_id
FROM order_items oi
INNER JOIN product_information pi USING(product_id)
INNER JOIN orders ord USING(order_id)
WHERE ord.customer_id IN(107, 149)
ORDER BY supplier_id;

2. Podzapytania:

SELECT DISTINCT supplier_id
FROM product_information
WHERE product_id IN
(SELECT product_id
FROM order_items
WHERE order_id IN
( SELECT order_id FROM orders WHERE customer_id IN(107, 149)
)
)

ORDER BY supplier_id;

[collapse]

Zadanie 4.

Wcielmy w życie zasadę Pareto (zasada 80/20). Mówi ona, że tylko ok. 20% klientów firmy odpowiada za ok. 80% jej przychodów. Sprawdźmy, czy podobna relacja zachodzi i tu.

W tym celu będziemy potrzebować: ID klienta, łącznej wartości zamówień klienta, udziału procentowego tych zamówień w stosunku do wszystkich zamówień, oraz podliczenia punktów procentowych.

Schamat: OE, Tabela: Customers, Kolumny: customer_id, order_total, Wynik: 47 rows

s4

 

 

 

 

Rozwiązanie

WITH Subquery AS
( SELECT DISTINCT customer_id,
SUM(order_total) OVER(partition BY customer_id) AS Customer_Total,
SUM(order_total) OVER() AS Total,
CAST(100* SUM(order_total) OVER(partition BY customer_id) / SUM(order_total) OVER() AS NUMBER(5,2)) AS Customer_Percent
FROM orders
)
SELECT customer_id, customer_total, customer_percent,
SUM(customer_percent) OVER(order by customer_percent DESC) AS Sum_Pct
FROM Subquery
ORDER BY customer_total DESC;

[collapse]

Zadanie 3.

Korzystając z tabeli Customers, policz, ile jest kobiet, a ilu mężczyzn. Wynik podaj w liczbach oraz procentach.

Schemat: OE, Tabela: Customers, Kolumny: gender, Wynik: 2 rows

s3

 

 

Rozwiązanie

SELECT gender, COUNT(*) AS "Count",
CAST(100* COUNT(*)/SUM(COUNT(*)) OVER() AS NUMBER(5,2)) AS "Percent"
FROM customers
GROUP BY gender;

[collapse]

Zadanie 2.

Czy więcej zamówień było złożonych przed godziną 14, czy później?

Schemat: OE, Tabela: Orders, Kolumny: order_id, order_date, Wynik: 2 rows

s2

 

 

 

Rozwiązanie

WITH

Przed14 AS (
SELECT COUNT(order_id) as Zamowienia, EXTRACT(hour from order_date) as Godzina
FROM orders
WHERE EXTRACT(hour from order_date) < 14
GROUP BY EXTRACT(hour from order_date)
),

Po14 AS (
SELECT COUNT(order_id) as Zamowienia, EXTRACT(hour from order_date) as Godzina
FROM orders
WHERE EXTRACT(hour from order_date) >= 14
GROUP BY EXTRACT(hour from order_date)
)

SELECT 'Zamowienia przed godz 14: '||SUM(Zamowienia) as wynik FROM Przed14
UNION
SELECT 'Zamowienia po godz 14: '||SUM(Zamowienia) FROM Po14;

[collapse]

 

Zadanie 28.

Rozwinięcie zadania 14: zmodyfikuj kwerendę tak, by uwzględniała i obsługiwała NULLe.

Schemat: HR, Tabela: Employees, Kolumny: first_name, last_name, employee_id, manager_id, Wynik: 196 rows

p28

 

 

 

Rozwiązanie

SELECT NVL(mgr.first_name, 'Nikt nie')
||' '
||NVL(mgr.last_name, '')
||' jest managerem '
||' '
||NVL(emp.first_name, 'niczyim')
||' '
||NVL(emp.last_name, '') AS "Manager"
FROM employees emp
FULL OUTER JOIN employees mgr
ON mgr.employee_id = emp.manager_id
ORDER BY mgr.employee_id;

[collapse]