SQL sorgularında toplama işlevlerini uygulamak için Group by cümlesi kullanıyoruz.
- Ancak, Grup cümlecikli sütun adı yerine sayısal değer kullanmanın ardındaki amaç nedir? Örneğin: 1'e göre gruplandırın.
SQL sorgularında toplama işlevlerini uygulamak için Group by cümlesi kullanıyoruz.
Yanıtlar:
Bu aslında IMHO'yu yapmak için gerçekten kötü bir şey ve çoğu diğer veritabanı platformlarında desteklenmiyor.
İnsanların bunu yapmasının sebepleri:
Kötü nedenleri:
bu kendi kendini belgeleme değil - birisinin gruplandırmayı anlamak için SELECT listesini ayrıştırması gerekecek. Aslında, SQL Server'da, MySQL'in yaptığı gibi ne olacağını bilen kovboyları desteklemeyen biraz daha net olurdu.
kırılgandır - birisi gelir ve SELECT listesini değiştirir, çünkü iş kullanıcıları farklı bir rapor çıktısı istediler ve şimdi çıktınız bir karmaşa. GROUP BY içinde sütun isimleri kullanmış olsaydınız, SELECT listesindeki sıralamanın önemi olmazdı.
SQL Server SİPARİŞ BY [sıralı] destekler; İşte kullanımına karşı bazı paralel argümanlar:
MySQL, GROUP BY
takma adlarla ( Sütun Takma Adlarıyla İlgili Sorunlar) yapmanızı sağlar . Bu GROUP BY
rakamlarla yapmaktan çok daha iyi olurdu .
column number
SQL diyagramlarındadır . Bir satır şöyle diyor: Sonucu verilen sütun numarasına veya bir ifadeye göre sıralar. İfade tek bir parametre ise, değer bir sütun numarası olarak yorumlanır. Negatif sütun numaraları, sıralama düzenini tersine çevirir.Google’ın bunu kullanmanın birçok örneği ve neden pek çoğunun kullanmayı bıraktığı var.
Size karşı dürüst olmak gerekirse, 1996'dan beri ORDER BY
ve GROUP BY
o zamandan beri sütun numaralarını kullanmadım (O zamanlar Oracle PL / SQL Development yapıyordum). Sütun numaralarını kullanmak gerçekten eski zamanlayıcılar içindir ve geriye dönük uyumluluk, bu tür geliştiricilerin MySQL ve hala buna izin veren diğer RDBMS'leri kullanmasını sağlar.
Aşağıdaki durumu göz önünde bulundurun:
+------------+--------------+-----------+
| 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 |
+------------+--------------+-----------+
Uygulamalar ve Uygulamalar aynı hizmet olarak kabul edilirse, günde servis başına indirme sayısını bulmanız gerekir. Göre gruplandırma date, services
neden olur Apps
ve Applications
ayrı hizmet kabul ediliyor.
Bu durumda, sorgu şöyle olacaktır:
select date, services, sum(downloads) as downloads
from test.zvijay_test
group by date,services
Ve Çıktı:
+------------+--------------+-----------+
| 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 |
+------------+--------------+-----------+
Ancak istediğiniz şey bu değil çünkü Uygulamalar ve Uygulamalar gruplanacak. Öyleyse ne yapabiliriz?
Tek yönlü değiştirmektir Apps
ile Applications
bir kullanarak CASE
ifade ya da IF
gibi hizmetlerin boyunca onları gruplama sonra fonksiyon ve:
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,services
Ancak bu , farklı hizmetleri göz önünde bulundurarak Apps
ve Applications
farklı hizmetler olarak gruplandırmakta ve öncekiyle aynı çıktıyı vermektedir:
+------------+--------------+-----------+
| 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 |
+------------+--------------+-----------+
Sütun numarası üzerinden gruplamak, diğer ad sütununda verileri gruplandırmanıza izin verir.
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,2;
Ve böylece size istenen çıktıyı aşağıdaki gibi vererek:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 4 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 9 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
Sorgu yazma veya takma bir sütun üzerinde gruplama işleminin tembel bir yöntem olduğunu birçok kez okudum, ancak MySQL'de çalışmaz, ancak takma ad sütunlar üzerinde gruplama yöntemidir.
Sorgu yazmak için tercih edilen yöntem bu değildir, yalnızca gerçekten bir diğer ad sütununda gruplandırmanız gerektiğinde kullanın.
Kullanmak için geçerli bir sebep yok. Bazıları zorla basılmış bir geliştiricinin gruplandırmanızı veya sıralamanızı daha sonra çözmesini veya birileri sütun sırasını değiştirdiğinde kodun perişan bir şekilde başarısız olmasına izin vermesini zorlaştırmak için özel olarak tasarlanmış tembel bir kısayoldur. Diğer geliştiricilerinize karşı saygılı olun ve bunu yapmayın.
Bu benim için çalıştı. Kod satırları 5 gruba kadar gruplandırır.
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
Sonuç aşağıdaki gibi olacak
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;
Yukarıdaki sorguları göz önünde bulundurun: 1'e göre gruplama, birinci sütuna göre gruplama ve 1,2'ye göre gruplama, birinci ve ikinci sütuna göre gruplama ve 1,2,3'e kadar gruplama, ikinci ve üçüncü sütuna göre gruplama anlamına gelir. Örneğin:
bu resim 1,2 ile gruplanan ilk iki sütunu gösterir, yani sayımı bulmak için dep_date'in farklı değerlerini dikkate almaz (ilk iki sütunun tüm farklı kombinasyonlarının sayısını hesaplamak için hesaba katılır)
görüntüsü. Burada ilk üç sütunun tümü göz önünde bulundurulur ve sayımı bulmak için farklı değerler vardır, yani, ilk üç sütunun tümüne göre gruplanır (sayımı hesaplamak için ilk üç sütunun tüm ayrı kombinasyonlarını dikkate alır).
order by 1
Sadecemysql>
komut isteminde otururken kullanın . Kodda kullanınORDER BY id ASC
. Durum, açık alan adı ve açık sipariş yönüne dikkat edin.