Tagi: to_char

Zadanie 25.

Korzystając z widoku z zadania 23, stwórzmy podsumowanie sprzedażowe z punktu widzenia sprzedawców i klientów:

a) Który klient złożył najwięcej zamówień, a który miał największą wartość zamówień?

s25a

 

 

 

b) podsumowanie sprzedaży według klienta i sprzedawcy (rollup)

s25b

 

 

 

 

 

 

 

c) wyznacz sprzedawców, którzy odpowiadają (łącznie) za ok. 70% sprzedaży.

s25c

 

 

 

d) wyznacz średnią wartość sprzedaży dla każdego sprzedawcy w danym roku oraz ilość obsłużonych klientów

 

s25d

 

 

 

Schemat: OE, Tabela: my_order_view (widok z zadania 23) , Kolumny: customer_id, order_id, order_total, sales_rep_id, ord_year, Wynik: a) 2 rows b) 112 rows c) 4 rows d) 20 rows

Rozwiązanie

a) WITH cte1 AS
(SELECT customer_id,
COUNT(order_id) AS orders
FROM my_order_view
GROUP BY customer_id
ORDER BY COUNT(order_id) DESC
FETCH FIRST row only
),
cte2 AS
(SELECT customer_id,
SUM(order_total) AS total
FROM my_order_view
GROUP BY customer_id
ORDER BY COUNT(order_total) DESC
FETCH FIRST row only
)
SELECT 'Max orders:' AS description, customer_id, orders AS total FROM cte1
UNION
SELECT 'Max value:', customer_id, total FROM cte2;

 

b) SELECT NVL(TO_CHAR(customer_id), 'total') AS customer_id,
NVL(TO_CHAR(sales_rep_id), 'total')     AS sales_rep_id,
SUM(order_total)  AS order_total
FROM my_order_view
WHERE sales_rep_id IS NOT NULL
GROUP BY cube(customer_id, sales_rep_id)
ORDER BY customer_id, sales_rep_id;

 

c) WITH cte AS
( SELECT DISTINCT sales_rep_id,
SUM(order_total) over(partition BY sales_rep_id) AS sales_rep_total,
SUM(order_total) over() AS total,
CAST(100* SUM(order_total) over(partition BY sales_rep_id) / SUM(order_total) over() AS NUMBER(5,2)) AS sales_rep_pct
FROM my_order_view
WHERE sales_rep_id IS NOT NULL
),
cte2 AS
(SELECT sales_rep_id,
sales_rep_total,
sales_rep_pct,
SUM(sales_rep_pct) over(order by sales_rep_pct DESC) AS total_pct
FROM cte
)
SELECT * FROM cte2 WHERE total_pct <= 70 ORDER BY sales_rep_pct DESC;

 

d) SELECT ord_year, sales_rep_id, TO_CHAR(AVG(order_total), '99999D99') AS orders_total,
COUNT(customer_id) AS customers
FROM my_order_view
WHERE sales_rep_id IS NOT NULL
GROUP BY sales_rep_id, ord_year
ORDER BY ord_year, sales_rep_id;

[collapse]

Zadanie 21.

Stwórz podsumowanie sprzedażowe – który ze sprzedawców jakich klientów obsłużył, na jaką kwotę ci klienci złożyli zamówienia, oraz jaką łączną wartość zamówień obsłużył sprzedawca.

Schemat: OE, Tabela: Orders, Kolumny: sales_rep_id, customer_id, order_total, Wynik: 76

s21

 

 

 

Rozwiązanie

SELECT NVL(TO_CHAR(sales_rep_id), 'total') AS "sales rep. id", NVL(TO_CHAR(customer_id), 'Sales Rep. total') AS "customer id", SUM(order_total) AS "Sum"
FROM orders
WHERE sales_rep_id IS NOT NULL
GROUP BY rollup(sales_rep_id, customer_id)
ORDER BY sales_rep_id;

[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 21.

Dla klientów o ID 101, 111, 121, 141, 171 i 201 pokaż numer oraz datę ostatniego złożonego zamówienia. Jeśli klient nie ma na swoim koncie zamówień, powinna pojawić się stosowna informacja.

Schemat: OE, Tabele: Orders, Customers, Kolumny: customer-id, order_id, order_date, Wynik: 6 rows

p21

 

 

Rozwiązanie

SELECT customer_id as Customer, MAX(o.order_id) as "Last order",
to_char(MAX(o.order_date), 'DD.MM.YYYY') as "Last ord. date",
CASE
WHEN MAX(o.order_id) IS NULL THEN 'Ten klient nie ma zamówień'
ELSE ' '
END as Opis
FROM customers c LEFT OUTER JOIN orders o
USING(customer_id)
WHERE customer_id IN(101, 111, 121, 141, 171, 201)
GROUP BY customer_id
ORDER BY customer_id;

[collapse]

Zadanie 17.

Dla każdego klienta pokaż datę oraz numer pierwszego złożonego zamówienia, a także łączną ilość złożonych przez niego zamówień. Datę zamówienia sformatuj wg wzoru (screen).

Schemat: OE, tabela: Orders, Kolumny: customer_id, order_id, order_date, Wynik: 47 rows

p17

 

 

 

Rozwiązanie

SELECT customer_id||' ' as Customer, to_char(MIN(order_date), 'DD.MM.YYYY HH:MM:SS') as "First Order Date", MIN(order_id)as "First Order ID",
COUNT(order_id) "Total Orders"
FROM orders
GROUP BY customer_id
ORDER BY Customer;

Uwaga: Konkatencja przy customer_id w klauzuli SELECT ma na celu wyłącznie poprawienie czytelności wyniku; w innym wypadku kolumny customer_id i order_date zlewają się ze sobą i trudniej odczytać dane. Ciąg customer_id z „doklejoną” spacją (można dokleić też „nic” czyli ”) jest traktowany jako ciąg tekstowy i wyrównywany do lewej, w przeciwieństwie do typów liczbowych, które są wyrównywane do prawej.

[collapse]

Zadanie 16.

Korzystając z tabeli Employees w schemacie HR:

a) wyświetl listę numerów departamentów w taki sposób, by wszystkie były trzycyfrowe (uzupełnij je zerami z lewej) oraz nie powtarzały się.

b) wyświetl id pracownika oraz jego datę urodzenia i pensję wg określonego formatu:

p16

 

 

 

 

c) wygeneruj każdemu pracownikowi nowy adres mailowy składający się z nazwiska, kropki, pierwszej litery imienia, numeru departamentu, z domeną @abc.com (przykład: kowalska.a90@abc.com):

p16c

 

 

 

 

Schemat: HR, Tabela: Employees, Kolumny: department_id, employee_id, first_name, last_name, hire_date, salary, Wynik: a) 12 rows, b) oraz c) 107 rows

Rozwiązanie

a) SELECT DISTINCT LPAD(department_id, 3, '0') as Department
FROM employees
ORDER BY Department;

b) SELECT employee_id, to_char(salary, '$99G999D99') as Salary, to_char(hire_date, 'DD MON YYYY') as "Hire Date"
FROM employees
ORDER BY employee_id;

c) SELECT employee_id, lower(last_name ||'.'||SUBSTR(first_name, 1, 1)||department_id||'@abc.com') as "New Email"
FROM employees
ORDER BY employee_id;

[collapse]

Zadanie 12.

Podlicz, ile jest produktów w każdej kategorii oraz policz średnią cenę produktu w kategorii.

Schemat: OE, Tabela: Product-Information, Kolumny: category_id, product_id, list_price, Wynik: 17 rows

p12

 

 

 

 

 

Rozwiązanie

SELECT category_id as "Category", COUNT(product_id) as "Count", to_char(AVG(list_price), '9999D99') as "Avg price"
FROM product_information
GROUP BY category_id
ORDER BY category_id;

[collapse]

Zadanie 10.

Policz, ile było zamówień na produkty z każdej kategorii w każdym roku.

Schemat: OE, Tabele: Orders, Order_Items, Product_Information, Kolumny: order_id, product_id, order_date, category_id, Wynik: 52 rows

p10

 

 

 

 

Rozwiązanie

SELECT to_char(o.order_date, 'YYYY') "Year", pi.category_id "Category", COUNT(product_id) "Amount"
FROM orders o INNER JOIN order_items oi
USING(order_id)
INNER JOIN product_information pi
USING(product_id)
GROUP BY to_char(o.order_date, 'YYYY'), pi.category_id
ORDER BY "Year", "Category";

[collapse]

Zadanie 9.

Stwórz raport sprzedażowy – policz wartość zamówień w każdym miesiącu każdego roku. Kolumnę z wartościami zamówień sformatuj według wzoru (screen).

Schemat: OE, Tabela: Orders, Kolumny: order_date, order_total, Wynik: 25 rows

p9

 

 

 

 

 

Rozwiązanie

SELECT to_char(order_date, 'YYYY') as "Year", to_char(order_date, 'MM') as "Month", to_char(SUM(order_total), '999,999.99') as "Total"
FROM orders
GROUP BY to_char(order_date, 'YYYY'), to_char(order_date, 'MM')
ORDER BY "Year", "Month";

[collapse]

Zadanie 7.

Korzystając z tabeli Employees (HR), stwórz zestawienie pracowników, tak jak przedstawiono na screenie, dla pracowników zarabiających między 10 a 14 tysięcy; wynik posortuj według zarobków (malejąco).

Schemat: HR, Tabela: Employees, Kolumny: First_Name, Last_name, Hire_Date, Salary, Wynik: 16 rows

07

 

 

Rozwiązanie

SELECT first_name||' '||last_name||' jest z nami od '||to_char(hire_date, 'DD.MM.YYYY')||' i zarabia '||salary as Zestawienie
FROM Employees
WHERE Salary BETWEEN 10000 AND 15000
ORDER BY Salary DESC;

[collapse]