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
Lepaskan: 2025-01-18 14:06:13
asal
765 orang telah melayarinya

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:

SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;
Salin selepas log masuk

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

SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;
Salin selepas log masuk

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:
SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname;
Salin selepas log masuk
  1. Sertai subkueri dengan jadual asal untuk mendapatkan semula lajur yang diperlukan:
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;
Salin selepas log masuk

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:

SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx
FROM makerar;
Salin selepas log masuk

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:
SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn 
FROM makerar;
Salin selepas log masuk
  1. Sertai hasil dengan jadual asal untuk menapis rn = 1 (tuple kedudukan pertama):
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;
Salin selepas log masuk

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 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