Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyelesaikan 'kolum 'wmname' mesti muncul dalam klausa GROUP BY atau digunakan dalam fungsi agregat' dalam SQL?
Menyelesaikan ralat SQL: "Lajur mesti muncul dalam klausa GROUP BY atau digunakan sebagai fungsi agregat"
Dalam pertanyaan SQL, jika medan pilih tidak disertakan dalam klausa GROUP BY
atau sebarang operasi pengagregatan dilakukan, "Lajur 'wmname' mesti muncul dalam klausa GROUP BY atau digunakan sebagai fungsi agregat. " mesej ralat .
Secara khusus, anda cuba mencari purata maksimum (purata) untuk setiap negara (cname) sambil mengembalikan nama pengurus negara yang sepadan (wmname). Walau bagaimanapun, wmname tidak disertakan dalam klausa GROUP BY
mahupun digunakan dalam mana-mana fungsi agregat.
Penyelesaian yang mungkin:
Terdapat beberapa cara untuk menyelesaikan masalah ini:
Kaedah 1: Menggunakan subqueries dan join
Kaedah ini melibatkan mencipta subkueri untuk mengira purata maksimum bagi setiap negara dan kemudian menggabungkan hasil dengan jadual asal untuk mengandungi nama pengurus negara.
<code class="language-sql">SELECT m.cname, m.wmname, t.mx FROM ( SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname ) t JOIN makerar m ON m.cname = t.cname AND t.mx = m.avg;</code>
Kaedah 2: Gunakan fungsi tetingkap
Fungsi tetingkap menyediakan cara untuk mendapatkan hasil ini tanpa menggunakan subquery.
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar;</code>
Kaedah 3: Gunakan DISTINCT dan ROW_NUMBER()
Pendekatan yang lebih jelas ialah menggunakan DISTINCT
untuk memastikan hasil yang unik dan ROW_NUMBER()
untuk memilih hanya baris dengan purata tertinggi bagi setiap negara.
<code class="language-sql">SELECT DISTINCT /* distinct here matters, because maybe there are various tuples for the same max value */ m.cname, m.wmname, t.avg AS mx FROM ( SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn FROM makerar ) t JOIN makerar m ON m.cname = t.cname AND m.wmname = t.wmname AND t.rn = 1;</code>
Dengan menggunakan salah satu kaedah ini, anda boleh mendapatkan semula hasil yang dijangkakan di mana nama pengurus negara (wmname) dikaitkan dengan betul dengan purata maksimum bagi setiap negara. Sila beri perhatian kepada fasal ROW_NUMBER()
ORDER BY
dalam kaedah tiga, yang penting untuk pemilihan purata maksimum yang betul. Versi sebelumnya tiada klausa ini, yang boleh menyebabkan hasil yang salah.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan 'kolum 'wmname' mesti muncul dalam klausa GROUP BY atau digunakan dalam fungsi agregat' dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!