Որոշելու համար, արդյոք գործարկողը 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-ում ներառելու.
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;
Ելք/ընտրանքային սինտաքսի տարբերակներ (կախված SDB-ից):
Որոշ SDB-ներում (օրինակ, SQLite) կա ավելի ճկուն կանոն, որը թույլ է տալիս ներառել ոչ-ագրեգատային սյունակները SELECT-ում առանց դրանց GROUP BY-ում ներառելու, եթե այդ սյունակները ֆունկցիոնալորեն կախված են GROUP BY-ում նշված սյունակներից (օրինակ, եթե CustomerID-ն PRIMARY KEY է և որոշում է բոլոր մյուս սյունակները): Սակայն սա ստանդարտ SQL չէ և կարող է հանգեցնել անսպասելի արդյունքների մյուս համակարգերում: Ուստի, ավելի լավ է հետևել ընդհանուր կանոնին։