>데이터 베이스 >MySQL 튜토리얼 >내 SQL 쿼리가 'GROUP BY 절에 나타나거나 집계 함수에 사용되어야 합니다'라는 메시지와 함께 실패하는 이유는 무엇입니까?

내 SQL 쿼리가 'GROUP BY 절에 나타나거나 집계 함수에 사용되어야 합니다'라는 메시지와 함께 실패하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-18 14:11:10784검색

Why Does My SQL Query Fail with

SQL 쿼리 오류 해결: "GROUP BY 절에 나타나거나 집계 함수에 사용해야 합니다."

SQL에서 집계 연산(예: MAX, MIN, SUM 등)을 수행할 때 SELECT 목록의 열은 GROUP BY 절에 나타나거나 집계 함수에 포함되어야 합니다. 이러한 제한을 통해 결과가 올바르게 그룹화되고 집계 값이 올바르게 계산됩니다.

예를 들어 테이블에 cname, wmnameavg 열이 있고 각 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>

이 메서드는 각 cnamewmname 조합에 대해 최대 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.