> 데이터 베이스 > MySQL 튜토리얼 > SQL '열은 GROUP BY 절에 나타나야 합니다' 오류를 해결하는 방법은 무엇입니까?

SQL '열은 GROUP BY 절에 나타나야 합니다' 오류를 해결하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-18 14:06:13
원래의
758명이 탐색했습니다.

How to Solve the SQL

"오류: 열은 GROUP BY 절에 있어야 합니다" 해결

SQL에서는 집계 작업(예: 최대값 찾기)을 수행할 때 집계에 사용되는 열도 GROUP BY 절에 나타나야 합니다. 그렇지 않으면 "열은 GROUP BY 절에 나타나거나 집계 함수로 사용되어야 합니다."라는 오류가 발생합니다.

테이블에서 각 고객 이름(cname)의 최대 평균 값(avg)을 찾고 싶다고 가정해 보겠습니다.

<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname;</code>
로그인 후 복사

이 쿼리는 GROUP BY 절에 wmname이 포함되어 있지 않기 때문에 오류를 반환합니다. 이 문제를 해결하려면 간단히 cname 및 wmname으로 그룹화하면 됩니다.

<code class="language-sql">SELECT cname, wmname, MAX(avg) FROM makerar GROUP BY cname, wmname;</code>
로그인 후 복사

그러나 이 방법은 각 고유 cname에 대한 최대 평균 값을 표시하는 예상 결과를 생성하지 않습니다. 대신 cname 및 wmname으로 그룹화되어 cname당 여러 행이 생성됩니다. 이 문제를 해결하려면 다음 방법 중 하나를 따르십시오.

하위 쿼리 및 조인 사용

  1. 하위 쿼리의 각 cname에 대한 최대 평균 값을 계산합니다.
<code class="language-sql">SELECT cname, MAX(avg) AS mx FROM makerar GROUP BY cname;</code>
로그인 후 복사
  1. 원래 테이블과 하위 쿼리를 결합하여 필수 열을 검색합니다.
<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>
로그인 후 복사

창 기능 사용

창 기능을 사용하면 지정된 창 내의 행 전체에 걸쳐 계산을 수행할 수 있습니다. 이 경우 PARTITION BY 절을 사용하여 cname별로 그룹화하고 각 파티션의 최대 평균 값을 계산할 수 있습니다.

<code class="language-sql">SELECT cname, wmname, MAX(avg) OVER (PARTITION BY cname) AS mx
FROM makerar;</code>
로그인 후 복사

이 방법은 모든 기록을 표시하지만 행당 cname당 최대 평균 값을 올바르게 표시합니다.

일치하는 고유 튜플 처리

최대 평균 값과 일치하는 고유한 튜플만 표시하려면 다음 방법을 사용할 수 있습니다.

  1. ROW_NUMBER() 함수를 사용하여 각 cname 파티션 내의 평균 값 순위를 계산합니다.
<code class="language-sql">SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn 
FROM makerar;</code>
로그인 후 복사
  1. 결과를 원래 테이블과 결합하여 rn = 1(첫 번째 순위 튜플)을 필터링합니다.
<code class="language-sql">SELECT DISTINCT /* distinct matters here */
    m.cname, m.wmname, t.avg AS mx
FROM (
    SELECT cname, wmname, avg, ROW_NUMBER() OVER (PARTITION BY cname ORDER BY avg DESC) AS rn 
    FROM makerar
) t JOIN makerar m ON m.cname = t.cname AND m.wmname = t.wmname AND t.rn = 1;</code>
로그인 후 복사

이 메소드는 각 cname의 최대 평균 값을 포함하는 고유 튜플 목록을 반환합니다. ORDER BY avg DESC을 기준으로 내림차순으로 순위가 지정되도록 avg을 추가하세요.

위 내용은 SQL '열은 GROUP BY 절에 나타나야 합니다' 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿