Aby operátor GROUP BY fungoval, musí být pole přítomno v příkazu SELECT?
sobes.tech AI
Odpověď od AI
Ano, ve většině relačních systémů správy databází (SQL) musí být pole uvedená v příkazu SELECT (s výjimkou agregačních funkcí) přítomna v příkazu GROUP BY.
Vysvětlení:
Příkaz GROUP BY seskupuje řádky se stejnými hodnotami ve specifikovaných sloupcích do jednoho souhrnného řádku. Příkaz SELECT určuje, které sloupce budou zobrazeny ve výsledku. Aby SELECT správně zobrazil hodnoty pro každou skupinu, musí všechny neseskupené sloupce v SELECT být součástí kritéria seskupení definovaného v GROUP BY. Jinak systém nebude schopen určit, kterou hodnotu má zobrazit.
Příklad:
Uvažujme tabulku Orders se sloupci CustomerID, OrderDate, Amount.
| CustomerID | OrderDate | Amount |
|---|---|---|
| 1 | 2023-01-01 | 100 |
| 1 | 2023-01-15 | 200 |
| 2 | 2023-01-05 | 150 |
Pokud chceme získat celkovou sumu objednávek pro každého zákazníka, použijeme GROUP BY CustomerID:
SELECT CustomerID, SUM(Amount)
FROM Orders
GROUP BY CustomerID;
Výsledek:
| CustomerID | SUM(Amount) |
|---|---|
| 1 | 300 |
| 2 | 150 |
Zde je CustomerID přítomen jak v SELECT, tak v GROUP BY. SUM(Amount) je agregační funkce a není nutné ji zahrnout do GROUP BY.
Chybný dotaz:
Pokud se pokusíme zahrnout OrderDate do SELECT bez jeho zařazení do GROUP BY CustomerID:
SELECT CustomerID, OrderDate, SUM(Amount)
FROM Orders
GROUP BY CustomerID;
Tento dotaz způsobí chybu, protože pro CustomerID = 1 existují dvě různé hodnoty OrderDate (2023-01-01 a 2023-01-15), a systém neví, kterou má zobrazit.
Aby byl tento dotaz platný, je třeba buď odstranit OrderDate z SELECT, nebo ho přidat do GROUP BY:
SELECT CustomerID, OrderDate, SUM(Amount)
FROM Orders
GROUP BY CustomerID, OrderDate;
Výjimky/syntaktické možnosti (závisí na SGBD):
V některých SGBD (například SQLite) existuje flexibilnější pravidlo, které umožňuje zahrnout neseskupené sloupce do SELECT bez jejich zařazení do GROUP BY, pokud jsou tyto sloupce funkčně závislé na sloupcích v GROUP BY (například pokud je CustomerID primárním klíčem a určuje všechny ostatní sloupce v tabulce). Nicméně, toto není standard SQL a může vést k nepředvídatelným výsledkům v jiných systémech. Proto je lepší dodržovat obecné pravidlo.