Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyelesaikan ORA-00979: Mengumpulkan Lajur dalam Pertanyaan SQL?
Memahami dan Menyelesaikan ORA-00979 dalam Pertanyaan SQL
Ralat ORA-00979, "bukan ungkapan GROUP BY," timbul apabila pertanyaan SQL menggunakan klausa GROUP BY
dengan salah. Ini berlaku apabila pernyataan SELECT
termasuk lajur yang tidak disebut dalam klausa GROUP BY
atau menggunakan fungsi agregat pada lajur tanpa pengumpulan.
Baris kumpulan klausa GROUP BY
dengan nilai yang sama dalam lajur yang ditentukan, membenarkan fungsi agregat (seperti SUM
, AVG
, MIN
, MAX
, COUNT
) untuk meringkaskan data dalam setiap kumpulan. Tanpa pengumpulan yang betul, pangkalan data tidak dapat menentukan nilai yang hendak dikaitkan dengan setiap kumpulan, yang membawa kepada ralat.
Contoh dan Penyelesaian:
Senario biasa yang menyebabkan ralat ini melibatkan pemilihan berbilang lajur, tetapi hanya mengumpulkan mengikut subset. Pangkalan data tidak dapat menentukan satu nilai untuk lajur yang tidak dikumpulkan dalam setiap kumpulan.
Untuk membetulkannya, sama ada:
Sertakan semua lajur bukan agregat dalam klausa GROUP BY
: Ini ialah penyelesaian paling mudah jika anda mahu melihat semua gabungan unik lajur yang dipilih.
Gunakan fungsi agregat pada lajur bukan berkumpulan: Jika anda hanya memerlukan statistik ringkasan untuk lajur tertentu, gunakan fungsi agregat (seperti MIN
, MAX
atau AVG
) pada lajur tersebut. Ini akan mengurangkan output kepada satu baris bagi setiap kumpulan.
Mari kita menggambarkan dengan pertanyaan yang diperbetulkan:
<code class="language-sql">SELECT cr.review_sk, cr.cs_sk, cr.full_name, MIN(TO_CHAR(cf.fact_date, 'mm/dd/yyyy')) AS appt, -- Using MIN to aggregate the date cs.cs_id, cr.tracking_number FROM review cr, cs, fact cf WHERE cr.cs_sk = cs.cs_sk AND UPPER(cs.cs_id) LIKE '%' || UPPER(i_cs_id) || '%' AND row_delete_date_time IS NULL AND cr.review_sk = cf.review_wk (+) AND cr.fact_type_code (+) = 183050 GROUP BY cr.review_sk, cr.cs_sk, cr.full_name, cs.cs_id, cr.tracking_number -- All non-aggregated columns are now included ORDER BY cs.cs_id, cr.full_name;</code>
Dengan memasukkan semua lajur tidak teragregat dengan betul dalam klausa GROUP BY
, pertanyaan akan dilaksanakan tanpa ralat ORA-00979, memastikan integriti data dan memberikan hasil yang diharapkan. Ingat untuk memilih pendekatan (termasuk semua lajur atau menggunakan fungsi agregat) yang paling sesuai dengan keperluan analisis data anda.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan ORA-00979: Mengumpulkan Lajur dalam Pertanyaan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!