Sql count խումբը օրինակներով: ԸՆՏՐԵԼ Հրամանի ԽՈՒՄԲ ԸՍՏ ԲԱԺԻՆ

Այս հոդվածում ես ձեզ կասեմ, թե ինչպես են խմբավորվում տվյալները, ինչպես ճիշտ օգտագործել խումբը ըստ և ունենալով SQL հարցումներ՝ օգտագործելով մի քանի հարցումների օրինակ:

Տվյալների բազաներում տեղեկատվության մեծ մասը պահվում է մանրամասն ձևով: Այնուամենայնիվ, հաճախ անհրաժեշտություն է առաջանում ստանալ հաշվետվություններ: Օրինակ՝ պարզեք օգտատերերի մեկնաբանությունների ընդհանուր թիվը կամ գուցե պահեստներում ապրանքների քանակը: Նմանատիպ առաջադրանքները շատ են: Հետևաբար, SQL լեզուն հատուկ նման դեպքերի համար տրամադրում է խմբին և ունի կառուցվածքներ, որոնք թույլ են տալիս համապատասխանաբար խմբավորել և զտել ստացված տվյալների խմբերը։

Այնուամենայնիվ, դրանց օգտագործումը բազմաթիվ խնդիրներ է առաջացնում ծրագրային ստեղծագործությունների սկսնակ հեղինակների համար: Նրանք այնքան էլ ճիշտ չեն մեկնաբանում ստացված արդյունքները և տվյալների խմբավորման մեխանիզմը: Հետևաբար, եկեք գործնականում պարզենք, թե ինչ և ինչպես է տեղի ունենում:

Որպես օրինակի մաս, ես կքննարկեմ ընդամենը մեկ աղյուսակ: Պատճառը պարզ է, այս օպերատորներն արդեն կիրառվում են ստացված տվյալների նմուշի վրա (աղյուսակի տողերը համատեղելուց և դրանք զտելուց հետո)։ Այսպիսով, որտեղ և join օպերատորների ավելացումը չի փոխի էությունը:

Պատկերացնենք վերացական օրինակ. Ենթադրենք, դուք ունեք ֆորումի օգտվողների ամփոփ աղյուսակ: Եկեք այն անվանենք userstat և այն ունի այսպիսի տեսք. Կարևոր կետ, մենք կարծում ենք, որ օգտվողը կարող է պատկանել միայն մեկ խմբի:

user_name - օգտվողի անուն

forum_group - խմբի անվանումը

mess_count - հաղորդագրությունների քանակը

is_have_social_profile - արդյոք ֆորումի պրոֆիլը պարունակում է հղում դեպի սոցիալական ցանցի էջի

Ինչպես տեսնում եք, աղյուսակը պարզ է, և դուք ինքներդ կարող եք շատ բան հաշվարկել՝ օգտագործելով հաշվիչ: Այնուամենայնիվ, սա ընդամենը օրինակ է, և կա ընդամենը 10 գրառում: Իրական տվյալների բազաներում գրառումները կարող են չափվել հազարներով: Այսպիսով, եկեք սկսենք հարցումներից:

Մաքուր խմբավորում՝ օգտագործելով խումբ ըստ

Եկեք պատկերացնենք, որ մենք պետք է իմանանք յուրաքանչյուր խմբի արժեքը, այն է՝ խմբի օգտատերերի միջին վարկանիշը և ֆորումում մնացած հաղորդագրությունների ընդհանուր քանակը։

Նախ՝ կարճ բանավոր նկարագրություն՝ SQL հարցումն ավելի հեշտ հասկանալու համար: Այսպիսով, դուք պետք է գտնեք հաշվարկված արժեքները ըստ ֆորումի խմբերի: Համապատասխանաբար, դուք պետք է այս բոլոր տասը տողերը բաժանեք երեք տարբեր խմբերի՝ ադմին, մոդեր, օգտատեր։ Դա անելու համար անհրաժեշտ է հարցման վերջում ավելացնել խմբավորում՝ ըստ forum_group դաշտի արժեքների: Եվ նաև ավելացրեք հաշվարկված արտահայտություններ՝ օգտագործելով այսպես կոչված ագրեգատ ֆունկցիաները:

Նշեք դաշտերը և հաշվարկված սյունակները ընտրեք forum_group, avg(raiting) որպես avg_raiting, sum(mess_count) as total_mess_count -- Նշեք աղյուսակը userstat-ից -- Նշեք խմբավորումն ըստ դաշտերի խմբի ըստ forum_group-ի

Խնդրում ենք նկատի ունենալ, որ հարցման մեջ խումբն ըստ կառուցվածքի օգտագործելուց հետո ընտրության մեջ կարող եք օգտագործել միայն այն դաշտերը, որոնք նշված են խմբի կողմից՝ առանց ագրեգատային ֆունկցիաների օգտագործման: Մնացած դաշտերը պետք է նշվեն ագրեգատ գործառույթների ներսում:

Ես նաև օգտագործել եմ երկու ագրեգատային ֆունկցիա. AVG - հաշվարկում է միջին արժեքը: Իսկ SUM - հաշվում է գումարը:

forum_groupմիջին_գնահատումtotal_mess_count
ադմին 4 50
մոդեր 3 50
օգտագործող 3 150

1. Նախ, աղբյուրի աղյուսակի բոլոր տողերը բաժանվեցին երեք խմբի՝ ըստ forum_group դաշտի արժեքների: Օրինակ, ադմինիստրատորի խմբում երեք օգտատեր կար: Մոդերի ներսում կա նաև 3 գիծ։ Իսկ օգտվողների խմբի ներսում կար 4 տող (չորս օգտվող):

2. Այնուհետև ագրեգատ գործառույթները կիրառվեցին յուրաքանչյուր խմբի համար: Օրինակ, ադմինիստրատորի խմբի համար միջին վարկանիշը հաշվարկվել է հետևյալ կերպ (2 + 5 + 5)/3 = 4: Հաղորդագրությունների քանակը հաշվարկվել է որպես (10 + 15 + 25) = 50:

Ինչպես տեսնում եք, ոչ մի բարդ բան չկա: Այնուամենայնիվ, մենք կիրառել ենք միայն մեկ խմբավորման պայման և չենք զտել ըստ խմբի: Այսպիսով, եկեք անցնենք հաջորդ օրինակին:

Խմբավորում՝ օգտագործելով խմբի կողմից և խմբերի զտում ունենալով

Հիմա եկեք դիտարկենք տվյալների խմբավորման ավելի բարդ օրինակ: Ենթադրենք, մենք պետք է գնահատենք գործողությունների արդյունավետությունը՝ օգտատերերին սոցիալական գործունեություն ներգրավելու համար: Պարզ ասած, պարզեք, թե խմբերում քանի օգտատեր են թողել իրենց պրոֆիլների հղումները, և քանիսն են անտեսել նամակագրությունները և այլն: Այնուամենայնիվ, իրական կյանքում կարող են լինել շատ նման խմբեր, ուստի մենք պետք է զտենք այն խմբերը, որոնք կարելի է անտեսել (օրինակ, շատ քիչ մարդիկ հղում չեն թողել. ինչու՞ խճճել ամբողջական զեկույցը): Իմ օրինակում սրանք խմբեր են միայն մեկ օգտագործողով։

Նախ, մենք բանավոր նկարագրելու ենք, թե ինչ է պետք անել SQL հարցումում: Մենք պետք է բաժանենք սկզբնական userstat աղյուսակի բոլոր տողերը՝ ըստ հետևյալ չափանիշների՝ խմբի անուն և սոցիալական պրոֆիլի առկայություն։ Համապատասխանաբար, անհրաժեշտ է աղյուսակի տվյալները խմբավորել ըստ forum_group և is_have_social_profile դաշտերի։ Սակայն մեզ չեն հետաքրքրում այն ​​խմբերը, որտեղ միայն մեկ մարդ կա։ Հետեւաբար, նման խմբերը պետք է զտվեն:

ՆշումԱրժե իմանալ, որ այս խնդիրը կարելի է լուծել միայն մեկ դաշտով խմբավորելով։ Եթե ​​օգտագործում եք պատյանների կոնստրուկցիան: Սակայն այս օրինակի շրջանակներում ցուցադրվում են խմբավորման հնարավորությունները։

Կցանկանայի նաև անմիջապես պարզաբանել մեկ կարևոր կետ. Դուք կարող եք զտել միայն ունենալով, երբ օգտագործում եք ագրեգատ գործառույթներ, և ոչ ըստ առանձին դաշտերի: Այլ կերպ ասած, սա որտեղ կառուցում չէ, այն տողերի խմբերի զտիչ է, այլ ոչ թե առանձին գրառումների: Թեև ներսում պայմանները նշված են նույն կերպ՝ օգտագործելով «կամ» և «և»:

Ահա թե ինչ տեսք կունենա SQL հարցումը

Նշեք դաշտերը և հաշվարկված սյունակները ընտրեք forum_group, is_have_social_profile, count(*) որպես ընդհանուր -- Նշեք աղյուսակը userstat-ից -- Նշեք խմբավորումն ըստ դաշտերի խմբի ըստ forum_group, is_have_social_profile -- Նշեք խմբի զտիչը, որն ունի count(*) > 1

Խնդրում ենք նկատի ունենալ, որ խմբից հետո դաշտերը բաժանված են ստորակետերով: Ընտրել դաշտերը նշելը տեղի է ունենում նույն կերպ, ինչպես նախորդ օրինակում: Ես նաև օգտագործել եմ ագրեգատ ֆունկցիայի հաշվարկը, որը հաշվարկում է խմբերում տողերի քանակը:

Ահա արդյունքը.

forum_groupis_have_social_profileընդհանուր
ադմին 1 2
մոդեր 1 2
օգտագործող 0 3

Եկեք քայլ առ քայլ նայենք, թե ինչպես ստացվեց այս արդյունքը:

1. Սկզբում ստացվել է 6 խումբ. Forum_group խմբերից յուրաքանչյուրը բաժանվեց երկու ենթախմբի՝ հիմնվելով is_have_social_profile դաշտի արժեքների վրա: Այլ կերպ ասած՝ խմբեր՝ , , , , , .

ՆշումԻ դեպ, պարտադիր չէ, որ լինի 6 խումբ Այսպիսով, օրինակ, եթե բոլոր ադմինիստրատորները լրացնեին պրոֆիլը, ապա կլինեն 5 խումբ, քանի որ is_have_social_profile դաշտը կունենա միայն մեկ արժեք ադմինիստրատորի խմբի համար:

2. Այնուհետև յուրաքանչյուր խմբի համար կիրառվել է ունենալու ֆիլտրի պայմանը: Հետևաբար, բացառվեցին հետևյալ խմբերը՝ , , . Քանի որ յուրաքանչյուր այդպիսի խմբի ներսում կար սկզբնաղբյուր աղյուսակի միայն մեկ տող:

3. Սրանից հետո հաշվարկվել են անհրաժեշտ տվյալները և ստացվել արդյունքը։

Ինչպես տեսնում եք, օգտագործման համար դժվար բան չկա:

Արժե իմանալ, որ կախված տվյալների բազայից, այս կոնստրուկտների հնարավորությունները կարող են տարբերվել: Օրինակ, կարող են լինել ավելի շատ ագրեգատային գործառույթներ, կամ կարող եք որպես խմբավորում նշել հաշվարկված սյունակները, այլ ոչ թե առանձին դաշտերը: Այս տեղեկատվությունը պետք է արդեն դիտարկել ճշգրտման մեջ:

Այժմ դուք գիտեք, թե ինչպես կարելի է խմբավորել տվյալները խմբի հետ, ինչպես նաև ինչպես զտել խմբերը՝ օգտագործելով ունենալը:


Կարևոր թիմերից մեկը SQL-ը GROUP BY-ն է. Այս կոնստրուկցիան ստեղծվել է աղյուսակից տողերի առանձին խմբեր ընտրելու համար, որոնցից յուրաքանչյուրում նշված են գործառույթները ԸՆՏՐԵԼ(Օրինակ, COUNT(), MIN ()և այլն): Դիտարկենք կոնկրետ օրինակներ։

Ենթադրենք, մենք ունենք սուպերմարկետների աղյուսակ.

  • id- եզակի նույնացուցիչ:
  • խանութ_id- սուպերմարկետի եզակի նույնացուցիչը:
  • գինը- կաթի գինը.

Յուրաքանչյուր սուպերմարկետում պետք է պարզենք կաթի միջին գինը։ նշեք, որ խանութ_idկարող է կրկնվել (ի վերջո, կան սուպերմարկետների ցանցեր)։ Հետեւաբար, մենք պետք է խումբ կազմենք ըստ խանութ_id, և այս խմբի յուրաքանչյուր տողի համար հաշվարկեք միջին գինը։

Բնօրինակ աղյուսակն ունի հետևյալ տեսքը.

Այսպիսով, մենք պարզեցինք միջին գինը որոշակի սուպերմարկետների ցանցում (կամ մեկ խանութում):

Մեկ այլ շատ տարածված օգտագործումը աղյուսակներից եզակի գրառումներ ստանալն է: Նախորդ օրինակում դուք նկատեցիք, որ ստացված նմուշում կրկնօրինակներ չկան խանութ_id, մինչդեռ սկզբնական աղյուսակում դրանք եղել են։

Ենթադրենք, որ մենք ունենք աղյուսակ օգտվողների հետ.

  • id- եզակի նույնացուցիչ:
  • էլ - էլօգտագործող.
  • հաշ- եզակի օգտվողի հաշ:

Եվ մեր առջեւ ընտրության խնդիր էր դրված եզակի օգտվողներ, և մասնավորապես եզակի մարդիկ, և ոչ եզակի հաշիվներ։ Ի վերջո, մեկ մարդ կարող է ունենալ 100 հաշիվներ տարբեր էլեւ իհարկե, id. Ա հաշ- սա որոշակի գիծ է, որը բնութագրում է նրան որպես յուրահատուկ մարդ։

Այսպիսով, մենք պետք է ընտրենք բոլոր գրառումները յուրահատուկ հեշով. Դրա համար կրկին օգտագործվում է ԽՈՒՄԲ ԸՍՏ:

ԸՆՏՐԵԼ * «Սեղանից» ԽՄԲԻՑ ԸՍՏ «հեշ»:

Արդյունքում կարդյունահանվեն միայն եզակիները հաշ, այն է 2 նույնական հաշԴուք դա չեք տեսնի ստացված նմուշում:

Ահա երկու գործնական SQL-ում GROUP BY-ի օգտագործման օրինակմենք դասավորեցինք այն:

Մենք վերանայել ենք բազմաթիվ նյութեր SQL, մասնավորապես Transact-SQL-ը, բայց մենք չշոշափեցինք այնպիսի իրոք պարզ թեմա, ինչպիսին տվյալների խմբավորում GROUP BY. Այսպիսով, այսօր մենք կսովորենք, թե ինչպես օգտագործել խումբն ըստ օպերատորի տվյալների խմբավորման համար:

Շատ սկսնակ ծրագրավորողներ, երբ բախվում են SQL-ի հետ, չգիտեն այնպիսի հնարավորության մասին, ինչպիսին է GROUP BY օպերատորի միջոցով տվյալների խմբավորումը, չնայած այս հատկությունը գործնականում բավականին հաճախ է պահանջվում, այս առումով մեր այսօրվա դասը, ինչպես սովորաբար, օրինակներով, նվիրված է: դեպի Ձեզ համար ավելի պարզ և հեշտ էր սովորել, թե ինչպես օգտագործել այս օպերատորը, քանի որ դուք անպայման կհանդիպեք դրան: Եթե ​​ձեզ հետաքրքրում է SQL թեման, ապա, ինչպես ասացի ավելի վաղ, մենք դրան անդրադարձել ենք ավելի քան մեկ անգամ, օրինակ, SQL Language - JOIN կամ Union and Union all հոդվածներում, որպեսզի կարողանաք ծանոթանալ այս նյութին: .

Իսկ ներածության համար մի փոքր տեսություն։

Ինչ է GROUP BY օպերատորը

ԽՈՒՄԲ ԸՍՏօպերատորն է ( կամ դիզայն, որն ավելի հարմար է ձեզ համար) SQL տվյալների խմբավորման համար ըստ դաշտի, երբ օգտագործվում են ագրեգատ գործառույթներ, ինչպիսիք են գումարը, առավելագույնը, նվազագույնը, count-ը և այլն:

Ինչպես գիտեք, ագրեգատ ֆունկցիաները աշխատում են մի շարք արժեքների հետ, օրինակ գումարը գումարում է բոլոր արժեքները: Բայց, ենթադրենք, պետք է գումարել ինչ-որ պայմանով կամ միանգամից մի քանի պայմանով, ահա թե ինչու է մեզ անհրաժեշտ խումբն ըստ օպերատորի, որպեսզի խմբավորի բոլոր տվյալները ըստ դաշտերի՝ ագրեգատ ֆունկցիաների արդյունքների ելքով:

Ինձ թվում է՝ այս ամենը օրինակներով վերլուծելը ավելի պարզ կլինի, ուստի անցնենք օրինակներին։

Նշում! Մենք բոլոր օրինակները կգրենք Management Studio SQL Server 2008-ում:

GROUP BY օպերատորի օգտագործման օրինակներ

Եվ նախ, եկեք ստեղծենք և լրացնենք թեստային աղյուսակը տվյալներով, որին մենք կուղարկենք մեր ընտրած հարցումները՝ օգտագործելով խմբի կողմից: Աղյուսակը և տվյալները, իհարկե, մտացածին են, զուտ օրինակ:

Ստեղծեք աղյուսակ

ՍՏԵՂԾԵՔ ՍԵՂԱՆԱԿ .( NULL, (50) NULL, NULL, NULL) ՇԱՐՈՒՆԱԿ

Ես այն լրացրեցի հետևյալ տեղեկատվությամբ.

  • ID – գրառումների նույնացուցիչ;
  • Անունը - աշխատողի ազգանունը;
  • Գումար - կանխիկ;
  • Մրցանակը միջոցների նշան է (օրինակ՝ 1-Աշխատավարձ, 2-Բոնուս):

Տվյալների խմբավորում՝ օգտագործելով խումբը հարցման միջոցով

Եվ հենց սկզբում նայենք շարահյուսությանը խումբ ըստ, այսինքն. որտեղ գրել այս շինարարությունը.

Շարահյուսություն:

Ընտրել ագրեգատային գործառույթներ

Սկսած աղբյուր

Որտեղ Ընտրության պայմանները

Խմբավորում ըստ խմբավորման դաշտեր

Ունենալով Համախառն գործառույթների պայմանները

Պատվիրել ըստ տեսակավորել դաշտերը

Այժմ, եթե մեզ անհրաժեշտ լինի որոշակի աշխատակցի բոլոր միջոցներն առանց խմբավորում օգտագործելու ամփոփելու, մենք կուղարկենք հետևյալ հարցումը.

SELECT SUM(summa) as summa FROM test_table WHERE name="Ivanov"

Իսկ եթե պետք է մեկ այլ աշխատողի գումարել, ապա պայմանը պարզապես փոխում ենք։ Համաձայնեք, եթե այդպիսի աշխատակիցները շատ են, ինչու՞ ամփոփել յուրաքանչյուրին, իսկ դա ինչ-որ տեղ պարզ չէ, ուստի խումբ առ օպերատոր մեզ օգնության է հասնում։ Մենք դիմում ենք գրում.

SELECT SUM(summa) որպես ամփոփում, անուն test_table-ից GROUP BY name

Ինչպես նկատեցիք, մենք ոչ մի պայման չենք գրում, և բոլոր աշխատակիցներին անմիջապես ցուցադրում ենք գումարի ամփոփված գումարը, որն ավելի պարզ է։

Նշում! Անմիջապես նշեմ, որ ի լրումն ագրեգատային ֆունկցիաների, մենք խմբում գրում ենք նույն թվով դաշտեր ըստ կառուցվածքի, կախված նրանից, թե քանի դաշտ ենք գրում հարցումում (այսինքն՝ դաշտերի խմբավորում): Մեր օրինակում մենք ցուցադրում ենք մեկ դաշտ, այնպես որ խմբի կողմից մենք նշել ենք միայն մեկ դաշտ (անունը, եթե մենք ցուցադրում ենք մի քանի դաշտ, ապա դրանք բոլորը պետք է նշվեն խմբում ըստ կառուցվածքի (դա կտեսնեք հաջորդիվ); օրինակներ):

Կարող եք նաև օգտագործել այլ գործառույթներ, օրինակ՝ հաշվել, թե ստացված միջոցների ընդհանուր քանակով քանի անգամ է ստացվել որոշակի աշխատակցին դրամական միջոցներ: Դա անելու համար, գումարի ֆունկցիայից բացի, կօգտագործենք նաև count ֆունկցիան։

SELECT SUM(summa) որպես [Ընդհանուր միջոցներ], COUNT(*) որպես [Անդորրագրերի քանակ], Անուն [Աշխատակից] FROM test_table GROUP BY name

Բայց ասենք սա քիչ է իշխանություններին, նրանք էլ են խնդրում նույն կերպ ամփոփել, բայց ըստ հատկանիշի խմբավորումով, այսինքն. ինչ փողի մասին է խոսքը (աշխատավարձ կամ բոնուս), դրա համար ուղղակի խմբավորմանը ավելացնում ենք մեկ այլ դաշտ, իսկ ավելի լավ հասկանալու համար կավելացնենք տեսակավորում ըստ աշխատողի, և արդյունքը կլինի հետևյալը.

SELECT SUM(summa) as [Total funds], COUNT(*) as [Receipts Number], Name [Employee] , Priz [Source] FROM test_table GROUP BY name, Priz ORDER BY name

Այժմ ամեն ինչ ցուցադրվում է, այսինքն. որքան գումար է ստացել աշխատողը, քանի անգամ և ինչ աղբյուրից։

Հիմա, համախմբելու համար, եկեք գրենք ավելի բարդ հարցում խմբավորման հետ, բայց նաև ավելացնենք այս աղբյուրի անունները, քանի որ կհամաձայնեք, որ ատրիբուտների նույնացուցիչների հիման վրա պարզ չէ, թե որ աղբյուրից են ստացվել միջոցները: Դրա համար մենք օգտագործում ենք շինարարությունը գործ.

SELECT SUM(summa) AS [Total cash], COUNT(*) AS [Ավելացումների թիվը], Անունը [Աշխատակից], CASE WHEN մրցանակ = 1 ապա «Աշխատավարձ» WHEN մրցանակ = 2 ապա «Բոնուս» ELSE «Աղբյուր չկա» END AS [Աղբյուր] FROM test_table ԽՈՒՄԲ ԸՍՏ անուն, մրցանակ ՊԱՏՎԻՐԵԼ ԸՍՏ անուն

Այժմ ամեն ինչ բավականին պարզ է և ոչ այնքան դժվար, նույնիսկ սկսնակների համար:

Անդրադառնանք նաև ագրեգատային ֆունկցիաների վերջնական արդյունքների պայմաններին ( ունենալով). Այսինքն՝ պայման ենք ավելացնում ոչ թե հենց տողերն ընտրելու, այլ ֆունկցիաների վերջնական արժեքի համար, մեր դեպքում դա գումարն է կամ count-ը։ Օրինակ, մենք պետք է ցուցադրենք նույնը, բայց միայն նրանք, ովքեր ունեն «ընդհանուր միջոցներ» 200-ից ավելի: Դա անելու համար ավելացրեք առկա պայմանը.

SELECT SUM(summa) as [Total cash], COUNT(*) as [Invember of recipe], Name [Employee], CASE WHEN priz = 1 ապա «Աշխատավարձ» WHEN priz = 2 ապա «Բոնուս» ELSE «Աղբյուր չկա» END AS [Աղբյուր] FROM test_table ԽՈՒՄԲ ԸՍՏ անուն, մրցանակ -- խումբ ՈՒՆԵՑՈՂ ԳՈՒՄԱՐ (գումար) > 200 --ընտրել ՊԱՏՎԻՐԵԼ ԸՍՏ անունի -- տեսակավորել

Այժմ մենք ցուցադրել ենք գումարի բոլոր արժեքները, որոնք մեծ են 200-ից, ամեն ինչ պարզ է:

Հուսով եմ, որ այսօրվա դասից հետո ձեզ համար պարզ դարձավ, թե ինչպես և ինչու օգտագործել դիզայնը խումբ ըստ. Հաջողություն! Մենք կշարունակենք ուսումնասիրել SQL-ն հետագա հոդվածներում:

Վերջին թարմացումը՝ 19.07.2017թ

T-SQL-ն օգտագործում է GROUP BY և HAVING հայտարարությունները տվյալների խմբավորման համար՝ օգտագործելով հետևյալ պաշտոնական շարահյուսությունը.

Ընտրեք սյունակներ աղյուսակից

ԽՈՒՄԲ ԸՍՏ

GROUP BY կետը որոշում է, թե ինչպես են խմբավորվելու տողերը:

Օրինակ, եկեք խմբավորենք ապրանքներն ըստ արտադրողի

SELECT Արտադրող, COUNT(*) AS ModelsCount FROM Products GROUP BY Արտադրողի կողմից

SELECT հայտարարության առաջին սյունակը - Manufacturer ներկայացնում է խմբի անվանումը, իսկ երկրորդ սյունակը՝ ModelsCount ներկայացնում է Count ֆունկցիայի արդյունքը, որը հաշվարկում է խմբի տողերի քանակը։

Արժե հաշվի առնել, որ ցանկացած սյունակ, որն օգտագործվում է SELECT հայտարարության մեջ (չհաշված սյունակները, որոնք պահում են ագրեգատ ֆունկցիաների արդյունքը) պետք է նշվի GROUP BY կետից հետո: Այսպիսով, օրինակ, վերը նշված դեպքում, արտադրողի սյունակը նշված է և՛ SELECT, և՛ GROUP BY կետերում:

Իսկ եթե SELECT դրույթը ընտրում է մեկ կամ մի քանի սյունակներում և օգտագործում է նաև ագրեգատ ֆունկցիաներ, ապա դուք պետք է օգտագործեք GROUP BY կետը: Այսպիսով, հետևյալ օրինակը չի աշխատի, քանի որ այն չի պարունակում խմբավորման արտահայտություն.

SELECT Արտադրող, COUNT(*) AS ModelsCount FROM Products

Մեկ այլ օրինակ, եկեք ավելացնենք խմբավորում ըստ ապրանքների քանակի.

SELECT Manufacturer, ProductCount, COUNT(*) AS ModelsCount FROM Products GROUP BY by Manufacturer, ProductCount

GROUP BY դրույթը կարող է խմբավորվել մի քանի սյունակների վրա:

Եթե ​​սյունակը, որի վրա խմբավորում եք, պարունակում է NULL արժեք, NULL արժեքով տողերը կկազմեն առանձին խումբ:

Նկատի ունեցեք, որ GROUP BY կետը պետք է լինի WHERE կետից հետո, բայց ORDER BY կետից առաջ.

SELECT Արտադրող, COUNT(*) AS ModelsCount FROM Products WHERE Գինը > 30000 ԽՈՒՄԲ ԸՍՏ Արտադրողի ՊԱՏՎԻՐԵԼ ԸՍՏ Մոդելների Հաշվարկը Նկարագրել

Խմբային զտում. ՈՒՆԵՑՈՂ

Օպերատոր ՈՒՆԵՑՈՂ որոշում է, թե որ խմբերը կներառվեն ելքային արդյունքում, այսինքն՝ զտում է խմբերը։

HAVING-ի օգտագործումը շատ առումներով նման է WHERE-ի օգտագործմանը: Միայն WHERE-ն օգտագործվում է տողերը զտելու համար, HAVING-ը՝ խմբերը զտելու համար:

Օրինակ, եկեք գտնենք բոլոր ապրանքային խմբերն ըստ արտադրողի, որոնց համար սահմանված է 1-ից ավելի մոդել.

SELECT Արտադրող, COUNT(*) AS ModelsCount FROM Products GROUP BY Manufacturer HAVING COUNT(*) > 1

Այս դեպքում մեկ հրամանով մենք կարող ենք օգտագործել WHERE և HAVING արտահայտությունները.

SELECT Արտադրող, COUNT(*) AS ModelsCount FROM Products WHERE Գինը * ProductCount > 80000 GROUP BY Manufacturer HAVING COUNT(*) > 1

Այսինքն՝ այս դեպքում նախ ֆիլտրվում են տողերը. ընտրվում են այն ապրանքները, որոնց ընդհանուր արժեքը 80000-ից ավելի է, այնուհետև ընտրված ապրանքները խմբավորվում են ըստ արտադրողի։ Եվ այնուհետև խմբերն իրենք են զտվում. ընտրվում են այն խմբերը, որոնք պարունակում են 1-ից ավելի մոդել:

Եթե ​​անհրաժեշտ է տեսակավորել, ապա ORDER BY արտահայտությունը գալիս է HAVING արտահայտությունից հետո.

SELECT Manufacturer, COUNT(*) AS Models, SUM (ProductCount) AS Units FROM Products WHERE Գինը * ProductCount > 80000 GROUP BY Manufacturer HAVING SUM(ProductCount) > 2 ORDER BY Unit DESC

Այս դեպքում խմբավորումը կատարվում է ըստ արտադրողի, և ընտրվում են նաև յուրաքանչյուր արտադրողի համար նախատեսված մոդելների քանակը (Models) և բոլոր ապրանքների ընդհանուր թիվը այս բոլոր մոդելների համար (Units): Վերջում խմբերը դասակարգվում են ըստ ապրանքների քանակի՝ նվազման կարգով:

Այս ձեռնարկում դուք կսովորեք, թե ինչպես օգտագործել SQL հայտարարությունը ԽՈՒՄԲ ԸՍՏշարահյուսությամբ և օրինակներով։

Նկարագրություն

SQL GROUP BY դրույթը կարող է օգտագործվել SELECT հայտարարության մեջ՝ տվյալների հավաքագրման համար բազմաթիվ գրառումներում և արդյունքները խմբավորելու մեկ կամ մի քանի սյունակների մեջ:

Շարահյուսություն

SQL-ում GROUP BY հայտարարության շարահյուսությունը հետևյալն է.

Պարամետրեր կամ փաստարկներ

express1 , express2 , … express_n Արտահայտություններ, որոնք ամփոփված չեն ագրեգատ ֆունկցիայի մեջ և պետք է ներառվեն GROUP BY-ում SQL հարցման վերջում: aggregate_function Սա ագրեգատային ֆունկցիա է, ինչպիսին է SUM, COUNT, MIN, MAX կամ AVG: aggregate_expression Սա այն սյունակն է կամ արտահայտությունը, որի համար կօգտագործվի aggregate_function: աղյուսակներ Սեղաններ, որոնցից ցանկանում եք առբերել գրառումները: FROM կետը պետք է նշի առնվազն մեկ աղյուսակ: WHERE պայմանները կամընտիր: Սրանք այն պայմաններն են, որոնք պետք է պահպանվեն գրառումները ընտրելու համար: ՊԱՏՎԻՐԵԼ ԸՍՏ արտահայտության Ըստ ցանկության: Արտահայտությունը, որն օգտագործվում է արդյունքների հավաքածուի գրառումները տեսակավորելու համար: Եթե ​​նշված են մեկից ավելի արտահայտություններ, ապա արժեքները պետք է բաժանվեն ստորակետերով: ASC կամընտիր: ASC-ն դասավորում է սահմանված արդյունքը աճման կարգով` ըստ արտահայտության: Սա լռելյայն վարքագիծ է, եթե ոչ մի փոփոխիչ նշված չէ: DESC Ընտրովի: DESC-ը դասավորում է սահմանված արդյունքը նվազման կարգով` ըստ արտահայտության:

Օրինակ - GROUP BY-ի օգտագործումը SUM ֆունկցիայի հետ

Տեսնենք, թե ինչպես օգտագործել GROUP BY SQL-ում SUM ֆունկցիայի հետ:
Այս օրինակում մենք ունենք աշխատողների աղյուսակ հետևյալ տվյալներով.

dept_id ընդհանուր_աշխատավարձեր
500 119500
501 113000

Այս օրինակում մենք օգտագործեցինք SUM ֆունկցիան՝ գումարելու բոլոր աշխատավարձերը յուրաքանչյուր dept_id-ի համար, և SUM(salary) արդյունքին տվեցինք «total_salaries» կեղծանունը։ Քանի որ dept_id-ը ներառված չէ SUM ֆունկցիայի մեջ, այն պետք է նշվի GROUP BY կետում:

Օրինակ - GROUP BY-ի օգտագործումը COUNT ֆունկցիայի հետ

Տեսնենք, թե ինչպես օգտագործել GROUP BY կետը COUNT ֆունկցիայի հետ SQL-ում:

Այս օրինակում մենք ունենք ապրանքների աղյուսակ հետևյալ տվյալներով.

Այս օրինակում մենք օգտագործեցինք COUNT ֆունկցիան՝ հաշվարկելու total_products-ի քանակը յուրաքանչյուր kategori_id-ի համար, և որպես COUNT ֆունկցիայի արդյունքներ նշել ենք «total_products» կեղծանունը: Մենք բացառեցինք բոլոր category_id արժեքները, որոնք NULL են՝ զտելով դրանք WHERE կետում: Քանի որ category_id-ը ներառված չէ COUNT ֆունկցիայի մեջ, այն պետք է նշվի GROUP BY կետում:

Օրինակ - GROUP BY-ի օգտագործումը MIN ֆունկցիայի հետ

Այժմ տեսնենք, թե ինչպես օգտագործել GROUP BY դրույթը MIN ֆունկցիայի հետ SQL-ում:

Այս օրինակում մենք կրկին կօգտագործենք աշխատողների աղյուսակը հետևյալ տվյալներով.

Ընտրվելու է 2 գրառում: Ահա այն արդյունքները, որոնք դուք կստանաք.

dept_id ամենացածր_աշխատավարձը
500 57500
501 42000

Այս օրինակում մենք օգտագործեցինք MIN ֆունկցիան՝ վերադարձնելու ամենացածր աշխատավարձի արժեքը յուրաքանչյուր dept_id-ի համար, և մենք անվանակոչեցինք «lowest_salary» MIN ֆունկցիայի արդյունքները: Քանի որ dept_id-ը ներառված չէ MIN ֆունկցիայի մեջ, այն պետք է նշվի GROUP BY կետում:

Օրինակ - Օգտագործելով GROUP BY MAX ֆունկցիայի հետ

Վերջապես, եկեք տեսնենք, թե ինչպես օգտագործել GROUP BY կետը MAX ֆունկցիայի հետ:

Եկեք նորից օգտագործենք աշխատողների աղյուսակը, բայց այս անգամ գտնենք ամենաբարձր աշխատավարձը յուրաքանչյուր dept_id-ի համար.

աշխատողի_համարը անուն Ազգանուն աշխատավարձ dept_id
1001 Ջասթին Բիբեր 62000 500
1002 Սելենա Գոմես 57500 500
1003 Միլա Կունիս 71000 501
1004 Թոմ Կրուիզ 42000 501

Մուտքագրեք հետևյալ SQL հայտարարությունը.



Կիսվել