Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyelesaikan ORA-00979: Mengumpulkan Lajur dalam Pertanyaan SQL?

Bagaimana untuk Menyelesaikan ORA-00979: Mengumpulkan Lajur dalam Pertanyaan SQL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-24 04:52:09728semak imbas

How to Resolve ORA-00979: Grouping Columns in SQL Queries?

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:

  1. Sertakan semua lajur bukan agregat dalam klausa GROUP BY: Ini ialah penyelesaian paling mudah jika anda mahu melihat semua gabungan unik lajur yang dipilih.

  2. 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!

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