602SQL-Úplná dokumentace Index  

Sbírka dotazů – str. 7

Příklad 13

Zadání: Zjistěte obraty a počty faktur firem po měsících.

SQL:

  SELECT Firmy.nazev, Month(dat1) AS Měsíc, 
    COUNT(Faktury.cislo) AS Počet, 
    SUM(Faktury.castka) AS Suma_Kč
  FROM Faktury, Firmy
  WHERE Faktury.firma= Firmy.cislo
  GROUP BY Firmy.nazev,Month(dat1)

Poznámka:

Pro skupinu je použita hodnota výrazu, místo funkce jazyka Month by šlo použít i SQL funkci EXTRACT ve tvaru

  EXTRACT (MONTH FROM dat1).

Příklad 14

Zadání: Vypište seznam všech firem a počet jejich faktur, včetně těch firem, které nemají ještě ani jednu fakturu.

SQL:

  SELECT Firmy.nazev, COUNT(Faktury.cislo)
  FROM Firmy LEFT OUTER JOIN Faktury
      ON (Firmy.cislo=Faktury.firma)
  GROUP BY Firmy.nazev

Poznámky:

a) Zajímavější by to bylo v případě, kdyby nás zajímaly pouze faktury jednoho druhu. Kam umístit podmínku Faktury.druh=2?

Správná odpověď je do podmínky JOINu za ON:

  SELECT Firmy.nazev, COUNT(Faktury.cislo)
  FROM Firmy LEFT OUTER JOIN Faktury 
      ON (Firmy.cislo=Faktury.firma AND Faktury.druh=2)
  GROUP BY Firmy.nazev

Kdyby se podmínka umístila (chybně) do části WHERE

  SELECT Firmy.nazev, COUNT(Faktury.cislo)
  FROM Firmy LEFT OUTER JOIN Faktury 
      ON (Firmy.cislo=Faktury.firma)
  WHERE Faktury.druh=2
  GROUP BY Firmy.nazev

výslekem by byl nesprávný výsledek, protože podmínka WHERE se vyhodnocuje až po provedení JOINu, a toto vyhodnocení JOINu neobsahuje sloupec druh.

b) Je použito jedno vnější propojení. Pokud by existovala další tabulka relačně svázaná s tabulkou Faktury (nazvaná Polozky) přes dvojici sloupců id_fakt, je možné vytvořit dotaz se dvěma vnějšími propojeními:

  SELECT *
  FROM Firmy LEFT OUTER JOIN Faktury 
               LEFT OUTER JOIN Polozky ON (Faktury.id_fakt=Polozky.id_fakt) 
       ON (Firmy.cislo=Faktury.firma)

nebo je možné uzávorkovat

  SELECT *
  FROM (Firmy LEFT OUTER JOIN Faktury ON (Firmy.cislo=Faktury.firma))
        LEFT OUTER JOIN Polozky ON (Faktury.id_fakt=Polozky.id_fakt)