Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan SQL Saya Gagal dengan 'mesti muncul dalam klausa GROUP BY atau digunakan dalam fungsi agregat'?

Mengapa Pertanyaan SQL Saya Gagal dengan 'mesti muncul dalam klausa GROUP BY atau digunakan dalam fungsi agregat'?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-18 14:11:10782semak imbas

Why Does My SQL Query Fail with

Selesaikan ralat pertanyaan SQL: "mesti muncul dalam klausa GROUP BY atau digunakan dalam fungsi agregat"

Dalam SQL, apabila melakukan operasi agregat (seperti MAX, MIN, SUM, dll.), lajur dalam senarai SELECT mesti muncul dalam klausa GROUP BY atau disertakan dalam fungsi agregat. Sekatan ini memastikan bahawa keputusan dikumpulkan dengan betul dan nilai agregat dikira dengan betul.

Sebagai contoh, katakan jadual anda mengandungi lajur cname, wmname dan avg dan anda ingin mencari nilai cname maksimum untuk setiap avg. Pertanyaan asal anda adalah seperti berikut:

<code class="language-sql">SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname;</code>

Pertanyaan ini gagal kerana lajur wmname tidak disertakan dalam klausa GROUP BY mahupun digunakan dalam fungsi agregat. Ini bermakna fungsi agregat MAX dinilai tanpa mengumpulkan dengan wmname, menghasilkan keputusan yang salah.

Kaedah berikut boleh menyelesaikan masalah ini:

Kaedah 1: Sertakan wmname dalam klausa GROUP BY:

<code class="language-sql">SELECT cname, wmname, MAX(avg)  FROM makerar GROUP BY cname, wmname;</code>

Kaedah ini mengembalikan nilai cname maksimum untuk setiap kombinasi wmname dan avg.

Kaedah 2: Gunakan subkueri:

<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 ini mula-mula mengira nilai cname maksimum untuk setiap avg menggunakan subkueri dan kemudian menggabungkannya dengan jadual asal untuk mendapatkan nilai wmname yang sepadan.

Kaedah 3: Gunakan fungsi tetingkap:

<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx
FROM makerar;</code>

Fungsi tetingkap MAX(avg) OVER (PARTITION BY cname) mengira nilai cname maksimum untuk setiap avg dan mengekalkan semua baris dalam hasilnya. Walau bagaimanapun, kaedah ini mungkin memaparkan baris pendua jika terdapat berbilang baris dengan nilai cname maksimum yang sama untuk avg tertentu.

Dengan mematuhi dengan betul keperluan lajur fungsi bukan agregat mesti muncul dalam klausa GROUP BY, anda boleh memastikan pertanyaan agregat menghasilkan hasil yang tepat dan bermakna.

Atas ialah kandungan terperinci Mengapa Pertanyaan SQL Saya Gagal dengan 'mesti muncul dalam klausa GROUP BY atau digunakan dalam fungsi agregat'?. 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