ホームページ >データベース >mysql チュートリアル >SQL の GROUP BY 句と ORDER BY 句の競合によって発生する ORA-00979 エラーを解決する方法
ORA-00979 のトラブルシューティング: GROUP BY
と ORDER BY
句の競合
SQL の ORA-00979 エラーは、GROUP BY
句と ORDER 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_name
に起因します。 cs.cs_id
と cr.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: 集計関数を使用する
グループ化に列が重要ではない場合は、MIN
、MAX
、またはデータに適したその他の集計関数を使用します。
<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 サイトの他の関連記事を参照してください。