Sobes.tech
Junior

Lai GROUP BY operators darbotos, vai lauks ir jābūt iekļautam SELECT izteiksmē?

sobes.tech AI

Atbilde no AI

Jā, lielākajā daļā relāciju datu bāzu (SQL) laukiem, kas norādīti SELECT operatorā (izņemot agregācijas funkcijas), ir jābūt iekļautiem GROUP BY operatorā.

Skaidrojums:

GROUP BY operators grupē rindas ar vienādām vērtībām norādītajos kolonnās vienā kopīgā rindā. SELECT operators nosaka, kuras kolonnas tiks rādītas rezultātā. Lai SELECT pareizi attēlotu vērtības katrai grupai, visas neagregatīvās kolonnas SELECT jāiekļauj GROUP BY nosacījumā. Pretējā gadījumā sistēma nezinās, kuru vērtību parādīt.

Piemērs:

Apskatīsim Orders tabulu ar kolonnām CustomerID, OrderDate, Amount.

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

Ja vēlamies iegūt kopējo pasūtījumu summu katram klientam, izmantojam GROUP BY CustomerID:

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

Rezultāts:

CustomerID SUM(Amount)
1 300
2 150

Šeit CustomerID ir iekļauts gan SELECT, gan GROUP BY. SUM(Amount) ir agregācijas funkcija un tai nav nepieciešams būt GROUP BY daļā.

Nepareiza vaicājuma piemērs:

Ja mēģināsim iekļaut OrderDate SELECT bez tās iekļaušanas GROUP BY:

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

Šis vaicājums radīs kļūdu, jo CustomerID = 1 ir divas dažādas OrderDate vērtības (2023-01-01 un 2023-01-15), un sistēma nezinās, kuru no tām parādīt.

Lai šis vaicājums būtu pareizs, vai nu noņemiet OrderDate no SELECT, vai iekļaujiet to GROUP BY:

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

Izņēmumi / sintakses varianti (atkarīgs no SDB):

Dažās SDB (piemēram, SQLite) ir elastīgāki noteikumi, kas ļauj iekļaut neagregatīvus laukus SELECT bez to iekļaušanas GROUP BY, ja šie lauki ir funkcionāli atkarīgi no GROUP BY laukiem (piemēram, ja CustomerID ir PRIMARY KEY un nosaka visus pārējos tabulas laukus). Tomēr tas nav SQL standarts un var radīt neparedzamus rezultātus citās sistēmās. Tādēļ ieteicams ievērot kopējo noteikumu.