I SQL-forespørgsler bruger vi Gruppe efter klausul til at anvende samlede funktioner.

  • Men hvad er formålet med at bruge numerisk værdi i stedet for kolonnenavn med Group by clause? For eksempel: Gruppér efter 1.

Kommentarer

  • Brug kun order by 1, når du sidder ved mysql> -prompten. I kode skal du bruge ORDER BY id ASC. Bemærk sagen, eksplicit feltnavn og eksplicit ordreretning.

Svar

Dette er faktisk en rigtig dårlig ting at gøre IMHO, og det understøttes ikke på de fleste andre databaseplatforme.

Årsagerne til, at folk gør det:

  • de “er dovne – Jeg ved ikke, hvorfor folk tror, at deres produktivitet forbedres ved at skrive kort kode i stedet for at skrive yderligere 40 millisekunder for at få meget mere bogstavelig kode.

Årsagerne til, at det er dårligt:

  • det er ikke selvdokumenterende – nogen bliver nødt til at analysere SELECT-listen for at finde ud af grupperingen. Det ville faktisk være lidt mere tydeligt i SQL Server, som ikke understøtter cowboy, som- ved-hvad-der-vil-ske gruppering som MySQL gør.

  • det er skørt – nogen kommer ind og ændrer SELECT-listen fordi forretningsbrugere ønskede en anden rapportoutput, og nu er din output et rod. Hvis du havde brugt kolonnenavne i GROUP BY, ville rækkefølgen på SELECT-listen være irrelevant.

SQL Server understøtter ORDER BY [ordinal]; her er nogle parallelle argumenter mod brugen:

Svar

MySQL giver dig mulighed for at gøre GROUP BY med aliaser ( Problemer med kolonnealiaser ). Dette ville være langt bedre end at gøre GROUP BY med tal.

Google har mange eksempler på brug af det, og hvorfor mange er stoppet med at bruge det.

For at være ærlig over for dig har jeg ikke brugt søjlenumre til ORDER BY og GROUP BY siden 1996 (jeg lavede Oracle PL / SQL-udvikling på det tidspunkt). Brug af kolonnenumre er virkelig til ældgamle timere og bagudkompatibilitet giver sådanne udviklere mulighed for at bruge MySQL og andre RDBMSer tillad stadig det.

Svar

Overvej nedenstående tilfælde:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Apps | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Apps | 1 | | 2016-05-31 | Videos | 1 | | 2016-05-31 | Videos | 1 | | 2016-06-01 | Apps | 3 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Videos | 2 | | 2016-06-01 | Apps | 2 | +------------+--------------+-----------+ 

Du skal finde ud af antallet af downloads pr. tjeneste pr. dag og betragter Apps og applikationer som den samme service. Gruppering efter date, services ville resultere i, at Apps og Applications betragtes som separate tjenester.

I så fald ville forespørgslen være:

 select date, services, sum(downloads) as downloads from test.zvijay_test group by date,services 

Og output:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Apps | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Apps | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Men det er ikke det, du ønsker, da applikationer og apps skal grupperes er kravet. Så hvad kan vi gøre?

En måde er at erstatte Apps med Applications ved hjælp af en CASE udtryk eller IF -funktionen og derefter gruppere dem over tjenester som:

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,services 

Men dette grupperer stadig tjenester, der betragter Apps og Applications som forskellige tjenester og giver den samme output som tidligere:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Applications | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Applications | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Gruppering over et kolonnenummer giver dig mulighed for at gruppere data i en aliaset kolonne.

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,2; 

Og dermed giver du det ønskede output som nedenfor:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 4 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 9 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Jeg har læs mange gange, at dette er en doven måde at skrive forespørgsler på eller gruppere over en aliaset kolonne, der ikke fungerer i MySQL, men det er sådan, at gruppere over aliaserede kolonner.

Dette er ikke den foretrukne måde at skrive forespørgsler på, brug det kun når du er virkelig nødt til at gruppere en aliaset kolonne.

Kommentarer

  • " Men dette grupperer stadig tjenester, der betragter Apps og applikationer som forskellige tjenester og giver den samme output som tidligere ".Ville ' ikke dette løses, hvis du ' har valgt et andet (ikke-modstridende) navn til aliaset?
  • @ Daddy32 Præcis min tanke. Eller endda rede igen (gruppe efter valg)

Svar

Der er ingen gyldig grund til at bruge det. Det er simpelthen en doven genvej, der er specielt designet til at gøre det vanskeligt for en hårdt presset udvikler at finde ud af din gruppering eller sortering senere eller for at lade koden mislykkes, når nogen ændrer kolonnerækkefølgen. Vær opmærksom på dine medudviklere, og gør det ikke.

Svar

Dette fungerer for mig. Koden grupperer rækker op til 5 grupper.

SELECT USR.UID, USR.PROFILENAME, ( CASE WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN @curRow := 0 ELSE @curRow := @curRow + 1 /*@curRow := 1*/ /*AND @curCode := USR.UID*/ END ) AS sort_by_total FROM SS_USR_USERS USR, ( SELECT @curRow := 0, @curCode := "" ) rt ORDER BY USR.PROFILENAME, USR.UID 

Resultatet bliver som følger

indtast billedebeskrivelse her

Svar

SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2; SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3; 

Overvej ovenstående forespørgsler: Gruppér med 1 middel til at gruppere efter den første kolonne og gruppere med 1,2 betyder at gruppere efter den første og anden kolonne og gruppere med 1,2,3 betyder at gruppere ved første anden og tredje kolonne. F.eks .:

gruppere efter 1,2

dette billede viser de første to kolonner grupperet med 1,2, dvs. det overvejer ikke de forskellige værdier for dep_date for at finde antallet (for at beregne tælle tages alle forskellige kombinationer af de første to kolonner i betragtning) mens den anden forespørgsel resulterer i dette gruppere efter 1,2,3

billede. Her overvejer det alle de første tre kolonner, og der er forskellige værdier for at finde antallet, dvs. det grupperes efter alle de første tre kolonner (for at beregne tælle tages alle forskellige kombinationer af de første tre kolonner i betragtning).

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *