IO, Bazy danych, laboratorium 1 - pkt. 18 - rozwiązanie

Napisz zapytanie, które wypisze wszystkie produkty, których cena jest większa od średniej ceny artykułu w sklepie.


SELECT
  *
FROM
  sklep 
WHERE
cena > (SELECT avg(cena) FROM sklep );
    

Napisz zapytanie, które wypisze wszystkie produkty, których cena jest większa od średniej ceny w obrębie danego artykułu.


SELECT
  s1.*
FROM
  sklep s1 
WHERE
s1.cena >= (SELECT avg(s2.cena) FROM sklep s2 WHERE s2.artykul = s1.artykul);
    

Napisz zapytanie, które wypisze wszystkie produkty, których cena jest równa minimalnej cenie w obrębie danego artykułu lub maksymalnej cenie w obrębie danego artykułu.


SELECT
  s1.*
FROM
  sklep s1 
WHERE
  s1.cena = (SELECT min(s2.cena) FROM sklep s2 WHERE s2.artykul = s1.artykul)
  OR 
  s1.cena = (SELECT max(s2.cena) FROM sklep s2 WHERE s2.artykul = s1.artykul);
    

Napisz zapytanie, które wypisze artykuł, dostawcę, cenę, minimalną cenę tego artykułu w sklepie, maksymalną cenę tego artykułu w sklepie, średnią cenę tego artykułu w sklepie, średnią cenę wszystkich artykułów w sklepie dla artykułów, których cena jest równa minimalnej lub maksymalnej cenie tego artykułu w sklepie.


SELECT
  s1.artykul, s1.dostawca, s1.cena,
  -- minimalna cena tego artykulu
  (SELECT min(s2.cena) FROM sklep s2 WHERE s2.artykul = s1.artykul) AS "min cena tego art",
  -- maksymalna cena tego artykulu
  (SELECT max(s2.cena) FROM sklep s2 WHERE s2.artykul = s1.artykul) AS "max cena tego art",
  -- srednia cena tego artykulu
  (SELECT avg(s2.cena) FROM sklep s2 WHERE s2.artykul = s1.artykul) AS "avg cena tego art",
  -- średnią cenę wszystkich artykułów w sklepie dla artykułów, których cena jest równa minimalnej lub maksymalnej cenie tego artykułu w sklepie
  (SELECT avg(cena)
  FROM (
    SELECT
      s3.*
    FROM
      sklep s3 
    WHERE
      s3.cena = (SELECT min(s2.cena) FROM sklep s2 WHERE s2.artykul = s3.artykul)
      OR 
      s3.cena = (SELECT max(s2.cena) FROM sklep s2 WHERE s2.artykul = s3.artykul)
  ) tmp )  
FROM sklep s1;
    

Zapytanie pomocnicze.


SELECT avg(cena)
FROM (
  SELECT
    s1.*
  FROM
    sklep s1 
  WHERE
    s1.cena = (SELECT min(s2.cena) FROM sklep s2 WHERE s2.artykul = s1.artykul)
    OR 
    s1.cena = (SELECT max(s2.cena) FROM sklep s2 WHERE s2.artykul = s1.artykul)
) tmp;