집 >데이터 베이스 >MySQL 튜토리얼 >내 SQL 쿼리가 'GROUP BY 절에 나타나거나 집계 함수에 사용되어야 합니다'라는 메시지와 함께 실패하는 이유는 무엇입니까?
SQL 쿼리 오류 해결: "GROUP BY 절에 나타나거나 집계 함수에 사용해야 합니다."
SQL에서 집계 연산(예: MAX, MIN, SUM 등)을 수행할 때 SELECT
목록의 열은 GROUP BY
절에 나타나거나 집계 함수에 포함되어야 합니다. 이러한 제한을 통해 결과가 올바르게 그룹화되고 집계 값이 올바르게 계산됩니다.
예를 들어 테이블에 cname
, wmname
및 avg
열이 있고 각 cname
에 대한 최대 avg
값을 찾으려고 한다고 가정합니다. 원래 쿼리는 다음과 같습니다.
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;</code>
wmname
열이 GROUP BY
절에 포함되지도 않고 집계 함수에도 사용되지 않기 때문에 이 쿼리는 실패합니다. 이는 MAX
집계 함수가 wmname
별로 그룹화되지 않고 평가되어 잘못된 결과가 발생함을 의미합니다.
다음 방법으로 이 문제를 해결할 수 있습니다.
방법 1: wmname
절에 GROUP BY
포함:
<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;</code>
이 메서드는 각 cname
및 wmname
조합에 대해 최대 avg
값을 반환합니다.
방법 2: 하위 쿼리 사용:
<code class="language-sql">SELECT m.cname, m.wmname, t.mx FROM ( SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname ) t JOIN makerar m ON m.cname = t.cname AND t.mx = m.avg;</code>
이 방법은 먼저 하위 쿼리를 사용하여 각 cname
의 최대 avg
값을 계산한 다음 이를 원본 테이블과 조인하여 해당 wmname
값을 검색합니다.
방법 3: 창 기능 사용:
<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx FROM makerar;</code>
창 함수 MAX(avg) OVER (PARTITION BY cname)
는 각 cname
의 최대 avg
값을 계산하고 결과의 모든 행을 유지합니다. 그러나 이 방법은 특정 cname
에 대해 최대 avg
값이 동일한 행이 여러 개 있는 경우 중복된 행을 표시할 수 있습니다.
비집계 함수 열이 GROUP BY
절에 나타나야 한다는 요구 사항을 올바르게 준수하면 집계 쿼리가 정확하고 의미 있는 결과를 생성할 수 있습니다.
위 내용은 내 SQL 쿼리가 'GROUP BY 절에 나타나거나 집계 함수에 사용되어야 합니다'라는 메시지와 함께 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!