Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyelesaikan Ralat 'Lajur Mesti Muncul dalam KUMPULAN OLEH Klausa' SQL?

Bagaimana untuk Menyelesaikan Ralat 'Lajur Mesti Muncul dalam KUMPULAN OLEH Klausa' SQL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-18 14:06:13799semak imbas

How to Solve the SQL

Menyelesaikan "Ralat: Lajur mesti muncul dalam klausa GROUP BY"

Dalam SQL, apabila melakukan operasi pengagregatan (seperti mencari nilai maksimum), lajur yang digunakan untuk pengagregatan juga mesti muncul dalam klausa GROUP BY. Kegagalan berbuat demikian akan mengakibatkan ralat: "Lajur mesti muncul dalam klausa GROUP BY atau digunakan sebagai fungsi agregat".

Andaikan anda ingin mencari nilai purata maksimum (purata) untuk setiap nama pelanggan (cname) dalam jadual:

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

Pertanyaan ini akan mengembalikan ralat kerana wmname tidak disertakan dalam klausa GROUP BY. Untuk membetulkannya, anda hanya boleh mengumpulkan mengikut cname dan wmname:

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

Walau bagaimanapun, kaedah ini tidak menghasilkan hasil yang diharapkan untuk menunjukkan nilai purata maksimum untuk setiap cname unik. Sebaliknya, ia akan dikumpulkan mengikut cname dan wmname, menghasilkan berbilang baris setiap cname. Untuk membetulkan isu ini, ikut salah satu kaedah berikut:

Menggunakan subqueries dan join

  1. Kira nilai purata maksimum untuk setiap cname dalam subquery:
<code class="language-sql">SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname;</code>
  1. Sertai subkueri dengan jadual asal untuk mendapatkan semula lajur yang diperlukan:
<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>

Gunakan fungsi tetingkap

Fungsi tetingkap membolehkan anda melakukan pengiraan merentas baris dalam tetingkap yang ditentukan. Dalam kes ini, anda boleh menggunakan klausa PARTITION BY untuk mengumpulkan mengikut cname dan mengira nilai purata maksimum dalam setiap partition:

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

Kaedah ini akan memaparkan semua rekod, tetapi ia akan memaparkan nilai purata maksimum setiap cname setiap baris dengan betul.

Kendalikan tupel unik yang sepadan

Jika anda hanya mahu memaparkan tupel unik yang sepadan dengan nilai purata maksimum, anda boleh menggunakan kaedah berikut:

  1. Gunakan fungsi ROW_NUMBER() untuk mengira kedudukan nilai purata dalam setiap partition cname:
<code class="language-sql">SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn 
FROM makerar;</code>
  1. Sertai hasil dengan jadual asal untuk menapis rn = 1 (tuple kedudukan pertama):
<code class="language-sql">SELECT DISTINCT /* distinct matters here */
    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>

Kaedah ini akan mengembalikan senarai tupel unik yang mengandungi nilai purata maksimum untuk setiap cname. Perhatikan penambahan ORDER BY avg DESC untuk memastikan kedudukan berada dalam susunan menurun berdasarkan avg.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat 'Lajur Mesti Muncul dalam KUMPULAN OLEH Klausa' 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