Rumah >pangkalan data >tutorial mysql >Bagaimanakah anda boleh menggunakan `AVG` dan `GROUP BY` dalam MySQL untuk mengira berbilang purata lajur bagi kumpulan berbeza dalam jadual?
Pertanyaan SQL dengan AVG dan Kumpulan Oleh
Dalam MySQL, pertanyaan yang mengekstrak berbilang purata lajur untuk kumpulan berbeza dalam jadual boleh dicapai menggunakan gabungan klausa AVG() dan GROUP BY. Pertimbangkan data_r1 jadual dengan struktur berikut:
mysql> select id, pass, val from data_r1 limit 10; +------------+--------------+----------------+ | id | pass | val | +------------+--------------+----------------+ | DA02959106 | 5.0000000000 | 44.4007000000 | | 08A5969201 | 1.0000000000 | 182.4100000000 | | 08A5969201 | 2.0000000000 | 138.7880000000 | | DA02882103 | 5.0000000000 | 44.7265000000 | | DA02959106 | 1.0000000000 | 186.1470000000 | | DA02959106 | 2.0000000000 | 148.2660000000 | | DA02959106 | 3.0000000000 | 111.9050000000 | | DA02959106 | 4.0000000000 | 76.1485000000 | | DA02959106 | 5.0000000000 | 44.4007000000 | | DA02959106 | 4.0000000000 | 76.6485000000 |
Untuk mengekstrak maklumat yang dikehendaki daripada jadual ini, gunakan pertanyaan berikut:
SELECT id, pass, AVG(val) AS val FROM data_r1 GROUP BY id, pass;
Pertanyaan ini mengumpulkan baris dalam jadual data_r1 oleh kedua-dua lajur id dan pas, dan kemudian mengira nilai purata lajur val untuk setiap kumpulan. Hasilnya ialah jadual dengan satu baris untuk setiap gabungan unik id dan pas, dengan nilai purata yang sepadan untuk val.
Pertanyaan alternatif, yang mencapai hasil yang sama tetapi mengembalikan satu baris untuk setiap id unik dengan nilai purata berbilang:
SELECT d1.id, (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 1) as val_1, (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 2) as val_2, (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 3) as val_3, (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 4) as val_4, (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 5) as val_5, (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 6) as val_6, (SELECT IFNULL(ROUND(AVG(d2.val), 4) ,0) FROM data_r1 d2 WHERE d2.id = d1.id AND pass = 7) as val_7 FROM data_r1 d1 GROUP BY d1.id
Pertanyaan ini menggunakan subkueri bersarang untuk mengira nilai purata bagi setiap nilai lulus dalam kumpulan id tertentu. Fungsi IFNULL() digunakan untuk memastikan bahawa nilai nol digantikan dengan 0, menghalang pembahagian dengan ralat sifar.
Atas ialah kandungan terperinci Bagaimanakah anda boleh menggunakan `AVG` dan `GROUP BY` dalam MySQL untuk mengira berbilang purata lajur bagi kumpulan berbeza dalam jadual?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!