首頁 >資料庫 >mysql教程 >如何解決SQL中GROUP BY和ORDER BY子句衝突導致的ORA-00979錯誤?

如何解決SQL中GROUP BY和ORDER BY子句衝突導致的ORA-00979錯誤?

Patricia Arquette
Patricia Arquette原創
2025-01-24 04:37:07535瀏覽

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

ORA-00979 故障排除:GROUP BYORDER BY 子句衝突

SQL 中的 ORA-00979 錯誤是由於 GROUP BYORDER BY 子句之間不匹配引起的。 GROUP BY 聚合數據,而 ORDER BY 則對數據進行排序。 當 ORDER BY 包含 GROUP BY 中不存在的欄位時,會發生錯誤。

理解問題

考慮這個產生 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>

錯誤源自於ORDER BY cs.cs_id, cr.full_namecs.cs_idcr.full_name 不在 GROUP BY 子句中。

要解 ORA-00979,ORDER BY 中的所有欄位必須位於 GROUP BY 中或聚合:

解 1:加到 GROUP BY

如果欄位對於分組至關重要,請將它們包含在 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>

解 2:使用聚合函數

如果欄位對於分組並不重要,請使用 MINMAX 等聚合函數或其他適合您資料的函數:

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

選擇正確的解決方案取決於您的查詢邏輯和所需的結果。 新增至 GROUP BY 可以保留更多詳細信息,而使用聚合函數可以匯總組內的資料。 在實施之前仔細考慮每種方法的含義。 請記住根據您的數據和期望的結果使用適當的聚合函數。

以上是如何解決SQL中GROUP BY和ORDER BY子句衝突導致的ORA-00979錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn