概要
表題の通り、ORACLEでGROUP BYで指定したカラム以外をORDER BYで使用するとエラーが発生します。その例を挙げて対応策をまとめます。
MySQLではエラーにならないものの、MySQL独自の機能のため使用する場合は明示的に集約関数を使用することを推奨します。
例
売上(sales)からユーザーIDごとの売上金額(amountの合計)を取得し、売上金額の降順に並べる例。
SELECT
user_id,
SUM(amount) total
FROM
sales
GROUP BY
user_id
ORDER BY
amount DESC;
この場合、amountはGROUP BYで使用していないため以下のエラーになります。
SQLSTATE[HY000]: General error: 979 OCIStmtExecute: ORA-00979: GROUP BYの式ではありません。
対応策
以下のように、SUM(amount)をORDER BYに指定することでエラーを解消することができます。
SELECT
user_id,
SUM(amount) total
FROM
sales
GROUP BY
user_id
ORDER BY
SUM(amount) DESC;
まとめ
- ORACLEでは、GROUP BYで指定したカラム以外をORDER BYに指定するとエラーが発生する
- MySQLではエラーは発生しないが意図しない結果を取得する可能性がある
- いずれも集約関数を明示的に記述する