Dalam kueri SQL, kami menggunakan Group by clause untuk menerapkan fungsi agregat.
- Tetapi apa tujuan di balik penggunaan nilai numerik alih-alih nama kolom dengan Group by clause? Misalnya: Kelompokkan oleh 1.
Dalam kueri SQL, kami menggunakan Group by clause untuk menerapkan fungsi agregat.
Jawaban:
Ini sebenarnya hal yang sangat buruk untuk dilakukan IMHO, dan tidak didukung di sebagian besar platform basis data lainnya.
Alasan orang melakukannya:
Alasannya buruk:
ini tidak mendokumentasikan diri sendiri - seseorang harus menguraikan daftar SELECT untuk mengetahui pengelompokan. Sebenarnya akan sedikit lebih jelas dalam SQL Server, yang tidak mendukung pengelompokan koboi yang tahu apa yang akan terjadi seperti yang dilakukan MySQL.
rapuh - seseorang masuk dan mengubah daftar SELECT karena pengguna bisnis menginginkan output laporan yang berbeda, dan sekarang output Anda berantakan. Jika Anda menggunakan nama kolom dalam GROUP BY, pesanan dalam daftar SELECT tidak akan relevan.
SQL Server mendukung ORDER OLEH [ordinal]; berikut adalah beberapa argumen paralel yang menentang penggunaannya:
MySQL memungkinkan Anda untuk melakukan GROUP BY
alias ( Masalah dengan Kolom Alias ). Ini akan jauh lebih baik dibandingkan GROUP BY
dengan angka.
column number
dalam diagram SQL . Satu baris mengatakan: Urutkan hasilnya dengan nomor kolom yang diberikan, atau dengan ekspresi. Jika ekspresi adalah parameter tunggal, maka nilainya ditafsirkan sebagai nomor kolom. Nomor kolom negatif membalik urutan.Google memiliki banyak contoh penggunaannya dan mengapa banyak yang berhenti menggunakannya.
Jujur dengan Anda, saya belum pernah menggunakan nomor kolom untuk ORDER BY
dan GROUP BY
sejak tahun 1996 (saya melakukan Oracle PL / SQL Development pada saat itu). Menggunakan nomor kolom adalah benar-benar untuk orang-orang tua dan kompatibilitas mundur memungkinkan pengembang untuk menggunakan MySQL dan RDBMS lainnya yang masih memungkinkan untuk itu.
Pertimbangkan kasus di bawah ini:
+------------+--------------+-----------+
| 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 |
+------------+--------------+-----------+
Anda harus mengetahui jumlah unduhan per layanan per hari dengan mempertimbangkan Aplikasi dan Aplikasi sebagai layanan yang sama. Pengelompokan menurut date, services
akan menghasilkan Apps
dan Applications
dianggap layanan terpisah.
Jika demikian, kueri akan:
select date, services, sum(downloads) as downloads
from test.zvijay_test
group by date,services
Dan Output:
+------------+--------------+-----------+
| 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 |
+------------+--------------+-----------+
Tapi ini bukan yang Anda inginkan karena Aplikasi dan Aplikasi yang akan dikelompokkan adalah persyaratan. Jadi apa yang bisa kita lakukan?
Salah satu caranya adalah menggantinya Apps
dengan Applications
menggunakan CASE
ekspresi atau IF
fungsi dan kemudian mengelompokkannya di atas layanan sebagai:
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,services
Tetapi ini masih mengelompokkan layanan mempertimbangkan Apps
dan Applications
sebagai layanan yang berbeda dan memberikan output yang sama seperti sebelumnya:
+------------+--------------+-----------+
| 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 |
+------------+--------------+-----------+
Pengelompokan pada nomor kolom memungkinkan Anda untuk mengelompokkan data pada kolom alias.
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,2;
Dan dengan demikian memberi Anda output yang diinginkan seperti di bawah ini:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 4 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 9 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
Saya telah membaca berkali-kali bahwa ini adalah cara malas menulis kueri atau pengelompokan pada kolom alias tidak berfungsi di MySQL, tetapi ini adalah cara pengelompokan atas kolom alias.
Ini bukan cara yang disukai untuk menulis kueri, gunakan hanya ketika Anda benar-benar perlu mengelompokkan lebih dari satu kolom alias.
Tidak ada alasan yang sah untuk menggunakannya. Ini hanyalah jalan pintas malas yang dirancang khusus untuk menyulitkan pengembang yang sulit untuk mengetahui pengelompokan atau pengurutan Anda nanti atau untuk memungkinkan kode gagal total ketika seseorang mengubah urutan kolom. Pertimbangkan sesama pengembang dan jangan lakukan itu.
Ini berhasil untuk saya. Kode mengelompokkan baris hingga 5 grup.
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
Hasilnya adalah sebagai berikut
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;
Pertimbangkan pertanyaan di atas: Kelompokkan dengan 1 berarti mengelompokkan menurut kolom pertama dan grup dengan 1,2 berarti mengelompokkan dengan kolom pertama dan kedua dan grup dengan 1,2,3 berarti mengelompokkan dengan kolom kedua dan ketiga pertama. Untuk misalnya:
gambar ini menunjukkan dua kolom pertama yang dikelompokkan oleh 1,2 yaitu, tidak mempertimbangkan nilai yang berbeda dari dep_date untuk menemukan hitungan (untuk menghitung jumlah semua kombinasi yang berbeda dari dua kolom pertama dipertimbangkan) sedangkan permintaan kedua menghasilkan ini
gambar. Di sini ia mempertimbangkan semua tiga kolom pertama dan ada nilai yang berbeda untuk menemukan penghitungan yaitu, itu adalah pengelompokan oleh semua tiga kolom pertama (untuk menghitung jumlah semua kombinasi yang berbeda dari tiga kolom pertama dipertimbangkan).
order by 1
hanya saat duduk saatmysql>
diminta. Dalam kode, gunakanORDER BY id ASC
. Catat kasus, nama bidang eksplisit, dan arah pemesanan eksplisit.