ホームページ >データベース >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 BY 句と ORDER BY 句の不一致によって発生します。 GROUP BY はデータを集計し、ORDER BY はデータを並べ替えます。 このエラーは、ORDER BYGROUP 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_name に起因します。 cs.cs_idcr.full_nameGROUP 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。