반응형
이런 오류: only_full_group_by가 활성화 가 되어 있어서 나는 오류 => group by 절에 엄격한 규칙을 따라야 하는 규칙
즉 집계 함수를 통해 구체화 되지 않았기 때문에 오류 발생
SELECT
CONCAT(YEAR(ul.join_date), '-', CEIL(MONTH(ul.join_date) / 3)) AS quarter,
COUNT(*) AS user_count,
(COUNT(*) * 1.0 / (SELECT COUNT(*) FROM User_List WHERE group_id = ?)) * 100 AS ratio
FROM
User_List ul
WHERE
ul.group_id = ?
GROUP BY
YEAR(ul.join_date), CEIL(MONTH(ul.join_date) / 3)
ORDER BY quarter ASC;
오류에 관한 메시지
2024-12-19T01:16:19.798+09:00 WARN 20808 --- [moa] [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1055, SQLState: 42000
2024-12-19T01:16:19.799+09:00 ERROR 20808 --- [moa] [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper :
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'moa_db.ul.join_date'
which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
org.springframework.dao.InvalidDataAccessResourceUsageException: JDBC exception executing
SQL [SELECT
CONCAT(YEAR(ul.join_date), '-', CEIL(MONTH(ul.join_date) / 3)) AS quarter,
COUNT(*) AS user_count,
(COUNT(*) * 1.0 / (SELECT COUNT(*) FROM User_List WHERE group_id = ?)) * 100 AS ratio
FROM
User_List ul
WHERE
ul.group_id = ?
GROUP BY
YEAR(ul.join_date), CEIL(MONTH(ul.join_date) / 3)
ORDER BY quarter ASC;
] [Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'moa_db.ul.join_date' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by] [n/a]; SQL [n/a]
only_full_group_by 모드가 활성화되어 있다는 겁니다. 이 모드는 MySQL에서 GROUP BY를 엄격하게 강제하며, GROUP BY 절에 포함되지 않은 열은 반드시 집계 함수(예: COUNT() 또는 MIN(), MAX() 등)에 포함되어야 한다
해셜 방안
- SQL 쿼리 수정 : GROUP BY 절에 명시적으로 필요한 열을 추가하거나, 집계 함수로 감싸 문제가 된 열을 처리한다
- SQL 모드 변경 (비추천) : only_full_group_by 모드를 비활성화하는 방법도 가능하지만, 이는 모범적인 설루션이 아니며 장기적으로 문제를 복잡하게 만들 수 있습니다. 따라서 추천하지 않습는다. -> 데이터의 일관성을 저하 시킴
- 집계 함수로 감싸기 : GROUP BY에 포함되지 않은 열을 반드시 집계 함수로 감싸야 하며, 집계를 통해 정의된 값을 적용할 수 있습니다.
해결한 코드
SELECT
CONCAT(YEAR(ul.join_date), '-', CEIL(MONTH(ul.join_date) / 3)) AS quarter,
COUNT(*) AS user_count,
(COUNT(*) * 1.0 / (SELECT COUNT(*) FROM User_List WHERE group_id = :groupId)) * 100 AS ratio
FROM
User_List ul
WHERE
ul.group_id = :groupId
GROUP BY
CONCAT(YEAR(ul.join_date), '-', CEIL(MONTH(ul.join_date) / 3))
ORDER BY
quarter ASC
""", nativeQuery = true)
ONLY_FULL_GROUP_BY가 필요한 이유 :
sql은 group by없이 애매한 데이터를 반환할 수 있는 쿼리를 허용하거나 일관되지 않은 출력물을 만들 수 있기 때문이다
반응형