Sobes.tech
Junior

Da li polje mora biti prisutno u SELECT naredbi da bi operator GROUP BY radio?

sobes.tech АИ

Одговор од АИ

Да, у већини релационих база података (SQL) поља наведена у оператору SELECT (осим агрегатних функција) морају бити присутна у оператору GROUP BY.

Објашњење:

Оператор GROUP BY групише редове са истим вредностима у наведеним колонама у једну укупну редицу. Оператор SELECT одређује колоне које ће бити приказане у резултату. Да би SELECT правилно приказао вредности за сваку групу, све неагрегатне колоне у SELECT морају бити део критеријума груписања, који је дефинисан у GROUP BY. У супротном, систем неће моћи да одреди коју вредност из групе да прикаже.

Пример:

Размотримо табелу Orders са колонама CustomerID, OrderDate, Amount.

CustomerID OrderDate Amount
1 2023-01-01 100
1 2023-01-15 200
2 2023-01-05 150

Ако желимо да добијемо укупну суму поруџбина за сваког клијента, користимо GROUP BY CustomerID:

SELECT CustomerID, SUM(Amount)
FROM Orders
GROUP BY CustomerID;

Резултат:

CustomerID SUM(Amount)
1 300
2 150

Овде CustomerID је присутан и у SELECT и у GROUP BY. SUM(Amount) је агрегатна функција и не захтева да буде укључена у GROUP BY.

Некоректан упит:

Ако покушамо да укључимо OrderDate у SELECT без укључивања у GROUP BY CustomerID:

SELECT CustomerID, OrderDate, SUM(Amount)
FROM Orders
GROUP BY CustomerID;

Овај упит ће изазвати грешку, јер за CustomerID = 1 постоје две различите вредности OrderDate (2023-01-01 и 2023-01-15), и систем не зна коју да прикаже за групу.

Да би овај упит био исправан, или уклоните OrderDate из SELECT, или га укључите у GROUP BY:

SELECT CustomerID, OrderDate, SUM(Amount)
FROM Orders
GROUP BY CustomerID, OrderDate;

Изузеци/Варијанте синтаксе (зависи од СУБД):

У неким СУБД (нпр. SQLite) постоји флексибље правило које дозвољава укључивање неагрегатних колона у SELECT без њиховог укључивања у GROUP BY, ако су те колоне функционално зависне од колона у GROUP BY (на пример, ако је CustomerID PRIMARY KEY и одређује све остале колоне у табели). Међутим, ово није стандард SQL и може довести до непредвидивих резултата у другим системима. Стога је боље придржавати се општег правила.