Барои ки оператори GROUP BY кор кунад, бояд майдон дар оператори SELECT мавҷуд бошад?
sobes.tech AI
Ҷавоб аз AI
Бале, дар зиёда аз базаҳои додаҳои релясионӣ (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 нест ва метавонад ба натиҷаҳои номуайян дар системҳои дигар оварда расонад. Аз ин рӯ, беҳтар аст, ки ба қоидаи умумӣ риоя кунед.