Rumah  >  Artikel  >  pangkalan data  >  Bagaimanakah anda boleh menggunakan `AVG` dan `GROUP BY` dalam MySQL untuk mengira berbilang purata lajur bagi kumpulan berbeza dalam jadual?

Bagaimanakah anda boleh menggunakan `AVG` dan `GROUP BY` dalam MySQL untuk mengira berbilang purata lajur bagi kumpulan berbeza dalam jadual?

Susan Sarandon
Susan Sarandonasal
2024-10-27 11:56:02427semak imbas

How can you use  `AVG` and `GROUP BY` in MySQL to calculate multiple averages of a column for different groups within a table?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn