Warning
This page is located in archive.

Ukázkové dotazy na databázi FoodMart

Jednoduché dotazy

Aktuální datum a čas

SELECT now();

Vyberte různá příjmení všech zaměstnanců

SELECT DISTINCT last_name FROM employee

Počty příjmení zaměstanců, řazeno sestupně dle počtu

SELECT last_name, COUNT(last_name) FROM employee GROUP BY last_name ORDER BY count(last_name) DESC

Procentuální zastoupení jmen zaměstnanců, záznamy seřazeny podle procentuálního zastoupní sestupně

SELECT last_name,
  (CAST(COUNT(last_name) as FLOAT)/(SELECT count(DISTINCT last_name) FROM employee)*100) AS percent
FROM employee GROUP BY last_name ORDER BY percent DESC

Dotazy spojující více tabulek

Roční prodeje a zisky v jednotlivých obchodech (store_id, store_name, total sales, total cost, [total profit])

SELECT store.store_id, store.store_name,
  SUM(ysales.store_sales * ysales.unit_sales) AS sales, SUM(ysales.store_cost* ysales.unit_sales ) AS cost,
  SUM((ysales.store_sales - ysales.store_cost)*ysales.unit_sales) AS profit
FROM store JOIN sales_fact_1997 AS ysales USING (store_id)
GROUP BY store.store_id, store.store_name
ORDER BY 3 DESC;

Všichni zákazníci a počet jejich nákupních týdnu (týdny, ve které nakupovali) větší než půlku týdnů v roce (365/7/2)

SELECT cust.customer_id, cust.fname, cust.lname, count(distinct stime.week_of_year) as purchases_weeks, 
  COUNT(DISTINCT stime.time_id) as customer_purchases
FROM customer AS cust JOIN sales_fact_1998 AS ysales USING (customer_id)
  JOIN time_by_day AS stime USING (time_id)
GROUP BY cust.customer_id, cust.fname, cust.lname
HAVING COUNT(DISTINCT stime.week_of_year) > (365/7/2)
ORDER BY purchases_weeks DESC;

Platy u všech zaměstnanců, které byly vyplaceny v mexických peso. Pokud nebyl nějakému zaměstatnanci vyplacen plat v pesech, má ve výpisu 0.

SELECT e.full_name, COALESCE(SUM(salary_paid), 0)
FROM employee e LEFT JOIN
  (SELECT * FROM salary JOIN currency USING(currency_id) WHERE currency = 'Mexican Peso') AS mexsal
  ON (mexsal.employee_id = e.employee_id) GROUP BY e.employee_id,e.full_name

Union, Except

Počet dodaných jednotek zboží v letech 1998 a 1997

SELECT SUM(units_ordered) FROM (
  SELECT * FROM inventory_fact_1997
  UNION
  SELECT * FROM inventory_fact_1998
) AS total_inv

Jména produktů, které byly prodány v roce 1997, ale už ne v roce 1998

SELECT product_name FROM (
  SELECT product_id FROM inventory_fact_1997
  EXCEPT
  SELECT product_id FROM inventory_fact_1998
) as total_inv
JOIN product USING(product_id)

Vnořené dotazy

Zaměstnanci s nadprůměrným platem

SELECT * FROM employee e WHERE e.salary > (SELECT AVG(salary) FROM employee)

Vsechny obchody s udajem, kolik zamestnancu maji v oddelenich zacinajicich na “HQ”

SELECT s.store_id, s.store_name, COALESCE(counts.cnt, 0)
FROM store s LEFT JOIN
  (SELECT e.store_id, count(*) AS cnt
   FROM employee e
   WHERE e.department_id IN (SELECT department_id FROM department WHERE department_description LIKE 'HQ%')
   GROUP BY e.store_id) counts
  ON s.store_id=counts.store_id

Nejstarší zaměstnanci v každém obchodě

SELECT s.store_id, s.store_name, e.full_name, e.birth_date
FROM store s JOIN employee e USING (store_id)
   JOIN
   (SELECT store_id, MIN(birth_date) AS datum
    FROM employee
    GROUP BY store_id) nejstarsi
   ON (e.store_id=nejstarsi.store_id) AND (e.birth_date=nejstarsi.datum) 

courses/a4b33ds/ukazkove-dotazy.txt · Last modified: 2017/02/17 14:49 by komenant