Mengapa kita menggunakan Grup demi 1 dan Grup sebesar 1,2,3 dalam kueri SQL?

26

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.
ursitesion
sumber
3
Gunakan order by 1hanya saat duduk saat mysql> diminta. Dalam kode, gunakan ORDER BY id ASC. Catat kasus, nama bidang eksplisit, dan arah pemesanan eksplisit.
dotancohen

Jawaban:

28

Ini sebenarnya hal yang sangat buruk untuk dilakukan IMHO, dan tidak didukung di sebagian besar platform basis data lainnya.

Alasan orang melakukannya:

  • mereka malas - saya tidak tahu mengapa orang berpikir produktivitas mereka ditingkatkan dengan menulis kode singkat daripada mengetik untuk tambahan 40 milidetik untuk mendapatkan kode yang lebih literal.

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:

Aaron Bertrand
sumber
9

MySQL memungkinkan Anda untuk melakukan GROUP BYalias ( Masalah dengan Kolom Alias ). Ini akan jauh lebih baik dibandingkan GROUP BYdengan angka.

Google memiliki banyak contoh penggunaannya dan mengapa banyak yang berhenti menggunakannya.

Jujur dengan Anda, saya belum pernah menggunakan nomor kolom untuk ORDER BYdan GROUP BYsejak 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.

RolandoMySQLDBA
sumber
8

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, servicesakan menghasilkan Appsdan Applicationsdianggap 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 Appsdengan Applicationsmenggunakan CASEekspresi atau IFfungsi 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 Appsdan Applicationssebagai 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.

IMVJ
sumber
" Tetapi ini masih mengelompokkan layanan yang mempertimbangkan Aplikasi dan Aplikasi sebagai layanan yang berbeda dan memberikan hasil yang sama seperti sebelumnya ". Tidakkah ini akan diselesaikan jika Anda telah memilih nama yang berbeda (tidak bertentangan) untuk alias?
Daddy32
3

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.

BriteSponge
sumber
0

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

masukkan deskripsi gambar di sini

kapal shuk - www.shipshuk.com
sumber
0
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:

kelompok dengan 1,2

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 kelompok sebesar 1,2,3

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

pembuat kode
sumber