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

  • A order by 1 funkciót csak ülve használja. a mysql> parancssorban. A kódban használja a ORDER BY id ASC parancsot. Jegyezze fel a kis- és nagybetűket, a explicit mező nevét és a pontos rendezési irányt.

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á.

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

írja ide a kép leírását

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:

1,2-es csoportosítás

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: csoportosítás 1,2,3

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).

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük