I SQL-spørsmål bruker vi Group by clause til å bruke samlede funksjoner.

  • Men hva er hensikten med å bruke numerisk verdi i stedet for kolonnenavn med Gruppe etter ledd? For eksempel: Grupper etter 1.

Kommentarer

  • Bruk order by 1 bare når du sitter ved mysql> ledeteksten. I kode bruker du ORDER BY id ASC. Legg merke til saken, eksplisitt feltnavn og eksplisitt bestillingsretning.

Svar

Dette er faktisk veldig dårlig ting å gjøre IMHO, og det støttes ikke i de fleste andre databaseplattformer.

Årsakene til at folk gjør det:

  • de «er late – Jeg vet ikke hvorfor folk tror produktiviteten deres forbedres ved å skrive kort kode i stedet for å skrive inn ekstra 40 millisekunder for å få mye mer bokstavelig kode.

Årsakene til at det er dårlig:

  • det er ikke selvdokumenterende – noen må analysere SELECT-listen for å finne ut grupperingen. Det ville faktisk være litt tydeligere i SQL Server, som ikke støtter cowboy som- vet-hva-vil-skje gruppering som MySQL gjør.

  • det er sprø – noen kommer inn og endrer SELECT-listen fordi forretningsbrukerne ønsket en annen rapportutgang, og nå er utdataene dine et rot. Hvis du hadde brukt kolonnenavn i GROUP BY, ville rekkefølgen i SELECT-listen være irrelevant.

SQL Server støtter ORDER BY [ordinal]; her er noen parallelle argumenter mot bruken:

Svar

MySQL lar deg gjøre GROUP BY med aliaser ( Problemer med kolonnealiaser ). Dette ville være langt bedre enn å gjøre GROUP BY med tall.

Google har mange eksempler på bruk og hvorfor mange har sluttet å bruke den.

For å være ærlig med deg, har jeg ikke brukt kolonnetall for ORDER BY og GROUP BY siden 1996 (jeg holdt på med Oracle PL / SQL-utvikling den gangen). Bruk av kolonnetall er virkelig for gammeldags og bakoverkompatibilitet som gjør at slike utviklere kan bruke MySQL og andre RDBMSer tillat det fremdeles.

Svar

Vurder nedenfor:

+------------+--------------+-----------+ | 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 må finne ut antall nedlastinger per tjeneste per dag, og vurderer apper og applikasjoner som den samme tjenesten. Gruppering etter date, services vil resultere i at Apps og Applications blir ansett som separate tjenester.

I så fall vil spørringen være:

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

Og utdata:

+------------+--------------+-----------+ | 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 dette er ikke hva du vil, siden applikasjoner og apper skal grupperes er kravet. Så hva kan vi gjøre?

En måte er å erstatte Apps med Applications ved å bruke en CASE uttrykk eller IF -funksjonen og gruppere dem deretter 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 fortsatt tjenester som vurderer Apps og Applications som forskjellige tjenester og gir samme utgang 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 | +------------+--------------+-----------+ 

Ved å gruppere over et kolonnenummer kan du gruppere data i en alias kolonne.

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

Og dermed gir du ønsket utgang 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 les mange ganger at dette er en lat måte å skrive spørsmål eller gruppere over en alias kolonne, fungerer ikke i MySQL, men dette er måten å gruppere over alias kolonner.

Dette er ikke den foretrukne måten å skrive spørsmål på, bruk det bare når du trenger virkelig å gruppere over en aliasert kolonne.

Kommentarer

  • " Men dette grupperer fortsatt tjenester som vurderer apper og applikasjoner som forskjellige tjenester og gir samme utgang som tidligere ".Ville ' ikke dette løses hvis du ' har valgt et annet (ikke-motstridende) navn for aliaset?
  • @ Daddy32 Akkurat tanken min. Eller til og med rede igjen (gruppe etter valg)

Svar

Det er ingen gyldig grunn til å bruke det. Det er rett og slett en lat snarvei som er spesielt designet for å gjøre det vanskelig for noen hardt pressede utviklere å finne ut grupperingen eller sorteringen din senere, eller for å la koden mislykkes når noen endrer kolonnerekkefølgen. Vær hensynsfull med dine medutviklere og ikke gjør det.

Svar

Dette fungerer for meg. Koden grupperer rader opptil 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 blir som følger

skriv inn bildebeskrivelse 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; 

Tenk på spørsmålene ovenfor: Gruppér med 1 middel for å gruppere etter den første kolonnen og gruppere med 1,2 betyr for å gruppere etter første og andre kolonne og gruppere etter 1,2,3 betyr for å gruppere av første andre og tredje kolonne. For eksempel:

gruppere etter 1,2

dette bildet viser de to første kolonnene gruppert med 1,2 dvs. det vurderes ikke de forskjellige verdiene av dep_date for å finne tellingen (for å beregne tellingen tas alle forskjellige kombinasjoner av de to første kolonnene i betraktning) mens den andre spørringen resulterer i gruppere etter 1,2,3

bilde. Her vurderer det alle de tre første kolonnene, og det er forskjellige verdier for å finne tellingen, dvs. det grupperes etter alle de tre første kolonnene (for å beregne tellingen tas alle forskjellige kombinasjoner av de første tre kolonnene i betraktning).

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *