Kad veiktų GROUP BY operatorius, ar turi būti laukas nurodytas SELECT sakinyje?
sobes.tech AI
Atsakymas iš AI
Taip, daugumoje reliacinių duomenų bazių (SQL) stulpeliai, nurodyti SELECT operatoriuje (išskyrus agregatines funkcijas), turi būti įtraukti į GROUP BY operatorių.
Paaiškinimas:
GROUP BY operatorius grupuoja eilutes su tomis pačiomis reikšmėmis nurodytuose stulpeliuose į vieną bendrą eilutę. SELECT operatorius nustato, kurie stulpeliai bus rodomi rezultate. Kad SELECT galėtų teisingai parodyti reikšmes kiekvienai grupei, visi neagregatiniai stulpeliai SELECT turi būti įtraukti į GROUP BY sąlygą. Kitaip sistema nežinos, kurią reikšmę parodyti.
Pavyzdys:
Pažiūrėkime į Orders lentelę su stulpeliais CustomerID, OrderDate, Amount.
| CustomerID | OrderDate | Amount |
|---|---|---|
| 1 | 2023-01-01 | 100 |
| 1 | 2023-01-15 | 200 |
| 2 | 2023-01-05 | 150 |
Jei norime gauti bendrą užsakymų sumą kiekvienam klientui, naudotume GROUP BY CustomerID:
SELECT CustomerID, SUM(Amount)
FROM Orders
GROUP BY CustomerID;
Rezultatas:
| CustomerID | SUM(Amount) |
|---|---|
| 1 | 300 |
| 2 | 150 |
Čia CustomerID yra ir SELECT, ir GROUP BY. SUM(Amount) yra agregatinė funkcija ir nereikalauja būti GROUP BY.
Neteisingas užklausa:
Jei bandytume įtraukti OrderDate į SELECT be jos įtraukties į GROUP BY:
SELECT CustomerID, OrderDate, SUM(Amount)
FROM Orders
GROUP BY CustomerID;
Ši užklausa sukels klaidą, nes CustomerID = 1 turi dvi skirtingas OrderDate reikšmes (2023-01-01 ir 2023-01-15), ir sistema nežino, kurią parodyti.
Kad ši užklausa būtų teisinga, arba pašalinkite OrderDate iš SELECT, arba įtraukite ją į GROUP BY:
SELECT CustomerID, OrderDate, SUM(Amount)
FROM Orders
GROUP BY CustomerID, OrderDate;
Išimtys / sintaksės variantai (priklauso nuo SDB):
Kai kuriose SDB (pvz., SQLite) galioja lankstesnės taisyklės, leidžiančios įtraukti neagregatinius stulpelius į SELECT be jų įtraukimo į GROUP BY, jei šie stulpeliai yra funkcionaliai priklausomi nuo GROUP BY stulpelių (pavyzdžiui, jei CustomerID yra PRIMARY KEY ir apibrėžia visus kitus lentelės stulpelius). Tačiau tai nėra SQL standartas ir gali sukelti nenumatytus rezultatus kituose sistemose. Todėl geriausia laikytis bendrojo taisyklės.