Kategoria: Oracle SQL

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 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]

 

 

Zadanie 1.

Korzystając z tabeli Order_Items znajdź te zamówienia, które zawierają produkty o id 3127 i 3106 (oba jednocześnie). Zadanie rozwiąż na co najmniej dwa sposoby.

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

s1

 

 

 

 

 

 

 

 

 

Rozwiązanie

1. Z użyciem INTERSECT:

SELECT order_id
FROM order_items
WHERE product_id = 3127

INTERSECT

SELECT order_id
FROM order_items
WHERE product_id = 3106

ORDER BY order_id;

2. Z użyciem EXISTS:

SELECT order_id
FROM order_items oi
WHERE product_id = 3127
AND EXISTS (
SELECT order_id
FROM order_items oi2
WHERE product_id = 3106 AND oi.order_id = oi2.order_id
)
ORDER BY order_id;

3. Z użyciem IN:

SELECT order_id
FROM order_items
WHERE product_id = 3127
AND order_id IN
( SELECT order_id FROM order_items WHERE product_id = 3106);

4. Z użyciem klauzuli WITH:

WITH Subquery AS (
SELECT order_id
FROM order_items
WHERE product_id = 3127 OR product_id = 3106
)

SELECT *
FROM Subquery
GROUP BY order_id
HAVING COUNT(*) >1
ORDER BY order_id;

5. Z podzapytaniem w klauzuli FROM:

SELECT order_id
FROM (
SELECT order_id
FROM order_items
WHERE product_id = 3127 OR product_id = 3106
) Tab
GROUP BY order_id
HAVING COUNT(*) >1
ORDER BY order_id;

[collapse]

Zadanie 27.

Korzystając z polskiego opisu produktu nr 2459 spraw, by wszystkie litery były wielkie, a zamiast spacji wstaw trzy kropki.

Schemat: OE, Tabela; Product_descriptions, Kolumny: product_id, language_id, translated_description, Wynik: 1 row

Rozwiązanie

SELECT upper(REPLACE(translated_description, ' ', '...'))
FROM product_descriptions
WHERE language_id = 'PL'
AND product_id = 2459;

[collapse]

Zadanie 26.

Korzystając z opisu produktów (PL) znajdź te które, zawierają słowo „monitor”. Wyświetlając wynik kwerendy, zastąp to słowo słowem „wyświetlacz”.

Schemat: OE, Tabela: Product_Descriptions, Kolumny: translated_description, language_id, Wynik: 17 rows

p26

 

 

Rozwiązanie

SELECT REPLACE(translated_description, 'monitor', 'wyświetlacz')
FROM product_descriptions
WHERE language_id = 'PL'
AND translated_description LIKE '%monitor%';

[collapse]

Zadanie 25.

Dla 10 ostatnich (najnowszych) zamówień określ, czy klient zamawiający ma credit_limit wystarczający na pokrycie kosztów zamówienia. Wynik podaj opisowo – order_id, customer_id, oraz „Limit OK” lub „Limit zbyt mały”.

Schemat: OE, Tabele: Customers, Orders, Kolumny: order_id, customer_id, credit_limit, order_total, Wynik: 10 rows

p25

 

 

 

 

 

 

Rozwiązanie

SELECT o.order_id, customer_id,
CASE
WHEN c.credit_limit >= o.order_total THEN 'Limit OK'
ELSE 'Limit zbyt maly'
END as Limity
FROM orders o INNER JOIN customers c
USING(customer_id)
ORDER BY o.order_id DESC
OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY;

[collapse]

Zadanie 24.

Dla zamówień o numerach 2355, 2413, 2377 i 2361 policz:

a) ile produktów zawiera każde z nich oraz podaj średnią cenę produktu

b) podaj kraj, z którego zostało złożone zamówienie; ile zamówień ma na koncie klient, który je złożył?

Schemat: OE, Tabele: Orders, Customers, Order_Items, Kolumny: order_id, product_id, unit_price, nls_territory, Wynik: 4 rows

Rozwiązanie

a) SELECT order_id, COUNT(product_id) as Products, to_char(AVG(unit_price), '999D99')as Avg_Price
FROM orders o INNER JOIN order_items oi USING(order_id)
WHERE order_id IN(2355, 2413, 2377, 2361)
GROUP BY order_id;

b) SELECT customer_id, MIN(c.nls_territory) as Country, COUNT(o.order_id) as Orders
FROM orders o INNER JOIN customers c USING(customer_id)
WHERE o.order_id IN(2355, 2413, 2377, 2361)
GROUP BY customer_id;

[collapse]
« Starsze wpsiy Recent Entries »