Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyelesaikan Ralat ORA-00979 yang Disebabkan oleh Konflik Klausa GROUP BY dan ORDER BY dalam SQL?

Bagaimana untuk Menyelesaikan Ralat ORA-00979 yang Disebabkan oleh Konflik Klausa GROUP BY dan ORDER BY dalam SQL?

Patricia Arquette
Patricia Arquetteasal
2025-01-24 04:37:07535semak imbas

How to Resolve ORA-00979 Errors Caused by GROUP BY and ORDER BY Clause Conflicts in SQL?

Menyelesaikan masalah ORA-00979: GROUP BY dan ORDER BY Konflik Klausa

Ralat ORA-00979 dalam SQL timbul daripada ketidakpadanan antara klausa GROUP BY dan ORDER BY. GROUP BY mengagregat data, manakala ORDER BY mengisihnya. Ralat berlaku apabila ORDER BY menyertakan lajur yang tidak terdapat dalam GROUP BY.

Memahami Masalah

Pertimbangkan contoh pertanyaan ini yang menghasilkan ralat ORA-00979:

<code class="language-sql">SELECT cr.review_sk, cr.cs_sk, cr.full_name,
       LISTAGG(TO_CHAR(cf.fact_date, 'mm/dd/yyyy'), ',') WITHIN GROUP (ORDER BY cf.fact_date) AS "appt",
       cs.cs_id, cr.tracking_number
FROM review cr JOIN cs ON cr.cs_sk = cs.cs_sk
JOIN fact cf ON cr.review_sk = cf.review_wk
WHERE UPPER(cs.cs_id) LIKE '%' || UPPER(i_cs_id) || '%'
  AND row_delete_date_time IS NULL
  AND cr.fact_type_code = 183050
GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number
ORDER BY cs.cs_id, cr.full_name;</code>

Ralat berpunca daripada ORDER BY cs.cs_id, cr.full_name. cs.cs_id dan cr.full_name tiada dalam klausa GROUP BY.

Penyelesaian

Untuk menyelesaikan ORA-00979, semua lajur dalam ORDER BY mestilah sama ada dalam GROUP BY atau diagregatkan:

Penyelesaian 1: Tambahkan pada GROUP BY

Jika lajur penting untuk mengumpulkan, masukkan lajur itu dalam fasal GROUP BY:

<code class="language-sql">GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number, cs.cs_id, cr.full_name
ORDER BY cs.cs_id, cr.full_name;</code>

Penyelesaian 2: Gunakan Fungsi Agregat

Jika lajur tidak penting untuk mengumpulkan, gunakan fungsi agregat seperti MIN, MAX atau lain-lain yang sesuai dengan data anda:

<code class="language-sql">GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number
ORDER BY MIN(cs.cs_id), MIN(cr.full_name);</code>

Memilih penyelesaian yang betul bergantung pada logik pertanyaan anda dan hasil yang diingini. Menambah pada GROUP BY mengekalkan lebih terperinci, sambil menggunakan fungsi agregat meringkaskan data dalam kumpulan. Pertimbangkan dengan teliti implikasi setiap pendekatan sebelum melaksanakannya. Ingat untuk menggunakan fungsi agregat yang sesuai berdasarkan data anda dan hasil yang diingini.

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat ORA-00979 yang Disebabkan oleh Konflik Klausa GROUP BY dan ORDER BY dalam 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