2011-01-06 2 views
32

뭔가 간단한 문제를 해결하는 데 도움이 필요합니다. 매우 쉬운 질문이지만 SQL에서 다소 혼란 스럽습니다.GROUP BY/SQL의 집계 함수 혼동

이 SQL 쿼리는 Oracle에서 'GROUP BY 표현식이 아닙니다'오류를 발생시킵니다. 나는 왜 튜플의 속성에 의해 일단 그룹화되면 다른 속성에 더 이상 액세스 할 수 없다는 것을 알기 때문에 그 이유를 이해합니다.

SELECT * 
FROM order_details 
GROUP BY order_no 

그러나이 하나되어 각 주문에 대한 ORDER_DETAILS 여러 튜플이 있다는 것을 가정하면 ....

SELECT SUM(order_price) 
FROM order_details 
GROUP BY order_no 

그냥이에 대한 나의 이해를 콘크리트 작업을 수행 I 그룹 튜플 번 order_no에 따르면 그룹의 각 개별 튜플에 대한 order_price 속성에 계속 액세스 할 수 있지만 집계 함수 만 사용하면됩니까?

즉, SELECT 절에서 사용될 때 집계 함수는 '숨겨진'속성을보기 위해 그룹으로 드릴 다운 할 수 있습니다. 단순히 'SELECT order_no'를 사용하면 오류가 발생합니다.

해명에 도움을 주셔서 감사합니다. Google에서이 특정 질문에 대한 답변을 찾는 데 어려움을 겪었습니다. 당신이 GROUP BY를 사용할 때 크리스

답변

34

표준 SQL (하지만 MySQL은)에서, 당신은 GROUP BY 절에 집계되지 않은 모든 결과 열을 나열해야합니다. 따라서 order_details에 6 개의 열이있는 경우 GROUP BY 절에있는 모든 6 개의 열 (이름별로 - GROUP BY 또는 ORDER BY 절에 *을 사용할 수 없음)을 나열해야합니다.

는 또한 수행 할 수 있습니다

모든 비 집계 열이 GROUP BY 절에 나열되어 있기 때문에 작동
SELECT order_no, SUM(order_price) 
    FROM order_details 
GROUP BY order_no; 

.

당신은 같은 것을 할 수있는 :이 쿼리는 정말 의미가없는 (또는 대부분의 아마 의미가 없습니다)

SELECT order_no, order_price, MAX(order_item) 
    FROM order_details 
GROUP BY order_no, order_price; 

을하지만, '작업'것이다. 개별 주문 번호와 주문 가격 조합을 나열하고 해당 가격과 관련된 최대 주문 항목 (번호)을 제공합니다. 주문의 모든 항목에 가격이 다르면 각각 한 행으로 구성된 그룹으로 끝납니다. OTOH, 동일한 가격 (예 : 각각 0.99 파운드)으로 주문에 여러 항목이있는 경우 해당 품목을 그룹화하고 해당 가격으로 최대 주문 품목 번호를 반환합니다. (테이블의 기본 키가 이고 순서의 첫 번째 항목이 order_item = 1이고 두 번째 항목이 2 인 것으로 가정하고 있음)

+0

GROUP BY가 실행 된 후에도 특정 order_no에 대한 모든 개별 튜플에 집계 함수가 계속 액세스 할 수 있습니다. 즉, SUM 함수는 여전히 각 튜플의 order_price 속성에 액세스 할 수 있습니다. 이러한 튜플은 order_no로 그룹화되었지만? – Chris

+5

@Chris : 예, 다소 차이가 있습니다. GROUP BY는 테이블의 행을 그룹으로 나눌 수 있습니다. 각 그룹에는 GROUP BY 절에 나열된 열에 대해 동일한 값 세트가 있습니다. 그런 다음 집계는 지정된 열 중 하나에서 작업하며 집계는 그룹의 행에 대해 계산됩니다. 결과는 GROUP BY 열 값과 연관된 집계와 함께 그룹당 하나의 행으로 구성됩니다. Hummm ... 나는 그것이 명백 할 것이기를 바란다. .. –

+0

그래, 나는 그것이 말할 수있는 한 완전히 그것을 깨끗하게했다. Jonathan과 감사의 말을 전하는 다른 사람들에게 감사드립니다. – Chris

0

group by 절을 사용하려면 select에서 모든 열을 언급해야합니다 group by 절에 명령문을 입력하고 집계 함수에서 컬럼을 선언하지 마십시오.

그룹 대신이 작업을 수행하려면 partition by 절을 사용할 수 있습니다. 하나의 포트만 사용하여 파티션을 그룹화 할 수 있습니다.

당신은 또한 당신이 때문에이 같은가없는 그룹을 오류를 던지는 것을의 모든 열을 선택하는 위의 쿼리에서 1

0
SELECT * 
FROM order_details 
GROUP BY order_no 

에 의해 파티션으로 그것을 만들 수 있습니다 .. 는

SELECT * 
    FROM order_details 
    GROUP BY order_no,order_details,etc 

이 등이 ORDER_DETAILS 테이블의 모든 열을 의미합니다 .. 당신이 선택 성명에서 모든 열이 GROUP BY 절에 있어야합니다 중 모든 열을 언급한다는 것을 방지 할 수 있습니다.

관련 문제