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
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.
- Noen mennesker fremdeles lærer det
- Noen har
column number
i SQL-diagrammer . En linje sier: Sorterer resultatet etter det gitte kolonnenummeret, eller etter et uttrykk. Hvis uttrykket er en enkelt parameter, tolkes verdien som et kolonnetall. Negative kolonnetall reverserer sorteringsrekkefølgen. - Apache har avviklet bruken fordi SQL Server har
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
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:
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
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).
order by 1
bare når du sitter vedmysql>
ledeteksten. I kode bruker duORDER BY id ASC
. Legg merke til saken, eksplisitt feltnavn og eksplisitt bestillingsretning.