Rumah >pangkalan data >tutorial mysql >Mengapa Pertanyaan SQL Saya Gagal dengan 'mesti muncul dalam klausa GROUP BY atau digunakan dalam fungsi agregat'?
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!