SQL-lekérdezésekben a Group by clause-t használjuk az összesített függvények alkalmazásához.
- De mi a célja annak, hogy numerikus értéket használjon az oszlopnév helyett a Group by clause-val? Például: Csoportosítás 1. szerint.
Megjegyzések
Válasz
Ez valójában nagyon rossz az IMHO, és ez a legtöbb adatbázis-platformon nem támogatott.
Az okok az emberek miatt:
- ők “lusták – Nem tudom, miért gondolják az emberek, hogy a termelékenységük javul, ha inkább kódot írnak, mint plusz 40 milliszekundumot gépelnek, hogy sokkal több szó szerinti kódot kapjanak.
A rossz okok:
-
ez nem öndokumentálás – valakinek a SELECT listát kell elemeznie, hogy kitalálja a csoportosítást. Valójában egy kicsit egyértelműbb lenne az SQL Serverben, amely nem támogatja a cowboy kit tudja, mi fog történni a csoportosítás, mint a MySQL.
-
ez törékeny – valaki bejön és megváltoztatja a SELECT listát, mert az üzleti felhasználók más jelentéskimenetet akartak, és most a kimenete rendetlenség. Ha a GROUP BY oszlopneveket használta, a SELECT listában a sorrend nem releváns.
Az SQL Server támogatja a ORDER BY [rendes]; íme néhány párhuzamos érv a használata ellen:
Válasz
A MySQL lehetővé teszi, hogy GROUP BY
álnevekkel ( Oszlop-álnevekkel kapcsolatos problémák ). Ez sokkal jobb lenne, ha GROUP BY
számokkal csinálná.
- Néhány ember még mindig megtanítja
- Egyesek
column number
-eket tartalmaznak az SQL-diagramokban . Az egyik sor azt mondja: Az eredményt a megadott oszlopszám vagy kifejezés alapján rendezi. Ha a kifejezés egyetlen paraméter, akkor az értéket oszlopszámként értelmezzük. A negatív oszlopszámok megfordítják a rendezési sorrendet. - Az Apache elavult a használatától, mert az SQL Server
A Google-nak számos példája van arra, hogy miért használja, és miért sokan abbahagyták a használatát.
Hogy őszinte legyek veled, még nem használtam oszlopszámokat a ORDER BY
és GROUP BY
1996 óta (akkoriban Oracle PL / SQL fejlesztést végeztem). Az oszlopszámok használata valóban a régebbi időzítők számára szól, és a visszamenőleges kompatibilitás lehetővé teszi az ilyen fejlesztők számára a MySQL és más RDBMS-ek használatát, amelyek továbbra is engedje meg.
Válasz
Vegye figyelembe az alábbi esetet:
+------------+--------------+-----------+ | 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 | +------------+--------------+-----------+
Meg kell találnia a szolgáltatásonkénti napi letöltések számát, figyelembe véve az Alkalmazásokat és az alkalmazásokat ugyanazt a szolgáltatást. A (z) date, services
szerinti csoportosítás azt eredményezné, hogy a Apps
és Applications
külön szolgáltatásnak minősül.
Ebben az esetben a lekérdezés a következő lenne:
select date, services, sum(downloads) as downloads from test.zvijay_test group by date,services
És kimenet:
+------------+--------------+-----------+ | 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 | +------------+--------------+-----------+
De nem ezt akarja, mivel az alkalmazások és alkalmazások csoportosítása a követelmény. Tehát mit tehetünk?
Az egyik módja a Apps
helyettesítése a Applications
kifejezésre a kifejezés vagy a IF
függvény, majd a szolgáltatások fölé csoportosítva ezeket:
select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,services
De ez még mindig csoportosítja a szolgáltatásokat, figyelembe véve a Apps
és a Applications
szolgáltatásokat, mint különböző szolgáltatásokat, és ugyanazt a kimenetet adja, mint korábban:
+------------+--------------+-----------+ | 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 | +------------+--------------+-----------+
Az oszlopszám feletti csoportosítás lehetővé teszi az adatok álneves oszlopba történő csoportosítását.
select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,2;
És így megkapja a kívánt kimenetet az alábbiak szerint:
+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 4 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 9 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+
I “ve sokszor olvassa el, hogy ez a lekérdezések írásának lusta módja vagy az álneves oszlopra történő csoportosítás nem működik a MySQL-ben, de az álnevezett oszlopok csoportosításának módja ez.
Ez nem a lekérdezések írásának preferált módja, csak akkor használja valóban álnevezett oszlopra kell csoportosítania.
Megjegyzések
- " Ez azonban továbbra is azokat a szolgáltatásokat csoportosítja, amelyek az alkalmazásokat és az alkalmazásokat különböző szolgáltatásoknak tekintik, és ugyanazt a kimenetet adják, mint korábban ".Nem oldható meg ' t ez, ha ' más (nem ütköző) nevet választott az álnévhez?
- @ Daddy32 Pontosan az én gondolatom. Vagy akár még egyszer fészkel (csoport kiválasztása után)
Válasz
Nincs érvényes ok a használatára. Ez egyszerűen egy lusta parancsikon, amelyet kifejezetten arra terveztek, hogy megnehezítse néhány nehéz helyzetben lévő fejlesztő számára a csoportosítás vagy a rendezés későbbi kitalálását, vagy lehetővé tegye a kód csúfos meghibásodását, ha valaki megváltoztatja az oszlopok sorrendjét. Legyen figyelmes a fejlesztőtársaival, és ne tegye.
Válasz
Ez nekem bevált. A kód a legfeljebb 5 csoportot sorol fel.
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
Az eredmény a következő lesz
Válasz
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;
Vegye figyelembe a fenti lekérdezéseket: Az 1-es csoportosítás azt jelenti, hogy az első oszlop szerint csoportosít, és az 1,2-es csoportosítást az első és a második oszlop szerinti csoportosításhoz, és az 1,2,3-as csoportosítást a csoportosításhoz az első második és a harmadik oszlop szerint. Például:
ez a kép az első két oszlopot 1,2 csoportosítással mutatja, vagyis nem veszi figyelembe a dep_date különböző értékeit a szám megtalálásához (a számolás kiszámításához az első két oszlop összes különféle kombinációját figyelembe vesszük) míg a második lekérdezés ezt eredményezi:
kép szerint. Itt az első három oszlopot veszi figyelembe, és különböző értékeket talál a számlálás megtalálásához, azaz az első három oszlop alapján csoportosítja (a számlálás kiszámításához az első három oszlop összes különféle kombinációját figyelembe vesszük).
order by 1
funkciót csak ülve használja. amysql>
parancssorban. A kódban használja aORDER BY id ASC
parancsot. Jegyezze fel a kis- és nagybetűket, a explicit mező nevét és a pontos rendezési irányt.