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;
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;
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:
SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname;
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;
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;
Kaedah ini akan memaparkan semua rekod, tetapi ia akan memaparkan nilai purata maksimum setiap cname setiap baris dengan betul.
Jika anda hanya mahu memaparkan tupel unik yang sepadan dengan nilai purata maksimum, anda boleh menggunakan kaedah berikut:
SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn FROM makerar;
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;
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!