Tagi: UNION

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

Utwórz tabelę, gdzie w jednej kolumnie będą liczby od 1 do 10, a w drugiej od 10 do 1. Nie używaj pętli.

Baza: -, Tabela: -, Kolumny: -, Wynik: 10 rows

s21

 

 

 

 

 

 

 

 

Rozwiązanie

WITH CTE AS
(
SELECT 1 as x
UNION SELECT 2
UNION SELECT 3
UNION SELECT 4
UNION SELECT 5
UNION SELECT 6
UNION SELECT 7
UNION SELECT 8
UNION SELECT 9
UNION SELECT 10
)

SELECT x, ROW_NUMBER() OVER(ORDER BY x DESC) as x2
FROM CTE
ORDER BY x;

[collapse]

Zadanie 19.

Wskaż, w których państwach i miastach (Country, City):

a) mają siedziby zarówno klienci, jak i dostawcy

b) mają siedziby dostawcy i klienci, ale nie pracownicy

c) są zarówno klienci i pracownicy, ale nie ma dostawców

Baza: Northwind, Tabele: dbo.Customers, dbo.Suppliers, dbo.Employees, Kolumny: Country, City, Wynik: a) 5 rows, b) 90 rows, c) 2 rows

Rozwiązanie

a) SELECT Country, City
FROM dbo.Customers

INTERSECT

SELECT Country, City
FROM dbo.Suppliers

 

b) SELECT Country, City
FROM dbo.Customers

UNION

SELECT Country, City
FROM dbo.Suppliers

EXCEPT

SELECT Country, City
FROM dbo.Employees

 

c) (SELECT Country, City
FROM dbo.Customers

EXCEPT

SELECT Country, City
FROM dbo.Suppliers)

INTERSECT

SELECT Country, City
FROM dbo.Employees

lub

SELECT Country, City
FROM dbo.Customers

INTERSECT

SELECT Country, City
FROM dbo.Employees

EXCEPT

SELECT Country, City
FROM dbo.Suppliers

[collapse]

Zadanie 18.

1. Stwórz kwerendę, która zwróci nazwę firmy, kraj oraz miasto klientów oraz dostawców.

2. Zmodyfikuj kwerendę tak, by pokazywała również kto jest dostawcą, a kto klientem. Wynik posortuj według typu (klienci najpierw), kraju i miasta.

Baza: Northwind, Tabele: dbo.Customers, dbo.Suppliers, Kolumny: CompanyName, Country, City, Wynik: 120 rows

s18

 

 

 

Rozwiązanie

1. SELECT CompanyName, Country, City
FROM dbo.Customers

UNION ALL

SELECT CompanyName, Country, City
FROM dbo.Suppliers

 

2. SELECT 'Customer' as 'Type', CompanyName, Country, City
FROM dbo.Customers

UNION ALL

SELECT 'Supplier' as 'Type', CompanyName, Country, City
FROM dbo.Suppliers

ORDER BY Type, Country, City

[collapse]