Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyelesaikan 'kolum 'wmname' mesti muncul dalam klausa GROUP BY atau digunakan dalam fungsi agregat' dalam SQL?

Bagaimana untuk Menyelesaikan 'kolum 'wmname' mesti muncul dalam klausa GROUP BY atau digunakan dalam fungsi agregat' dalam SQL?

Barbara Streisand
Barbara Streisandasal
2025-01-18 13:56:11399semak imbas

How to Solve

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!

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