Sobes.tech
Junior

Որոշելու համար, արդյոք գործարկողը 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), և համակարգը չգիտի, թե որ արժեքը ցույց տալ:

Այս հարցումը ճիշտ դարձնելու համար, կամ հեռացրեք OrderDateSELECT-ից, կամ ներառեք այն 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 չէ և կարող է հանգեցնել անսպասելի արդյունքների մյուս համակարգերում: Ուստի, ավելի լավ է հետևել ընդհանուր կանոնին։