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
Lepaskan: 2025-01-18 14:11:10
asal
777 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan