복붙노트

[SQL] GROUP BY / SQL의 집계 함수 혼란

SQL

GROUP BY / SQL의 집계 함수 혼란

나는 약간의 도움이 뭔가를 교정해야합니다, 나는 그것을 아주 쉬운 쉬운 질문 알고 있지만 약간 SQL에서 저를 혼란 그것의 무언가.

이 SQL 쿼리는 오라클의 오류 '표현에 의해 아닌 GROUP'이 발생합니다. 내가 그 튜플의 속성에 의해 I 그룹 한 번, 내가 할 수있는 더 이상 액세스 다른 속성을 모르는 나는, 왜 이해합니다.

SELECT * 
FROM order_details 
GROUP BY order_no

그러나 이것은 하나의 작업을 수행

SELECT SUM(order_price)
FROM order_details
GROUP BY order_no

그냥 만들어 I 그룹 일단 튜플이 order_no 시리얼에 따라, 나는 아직도 그룹의 각 튜플의 order_price 속성에 접근 할 수있는 각각의 주문 ORDER_DETAILS에 여러 튜플이 있다고 가정하면 ....이 내 이해를 콘크리트, 하지만 집계 함수를 사용하고 계십니까?

즉, SELECT 절에 사용되는 집계 함수 경우는 '숨겨진'속성을 볼 수있는 그룹으로 드릴 다운 할 수 있습니다, 단순히 'order_no 시리얼 SELECT'사용하는 경우 오류가 발생합니다?

해결법

  1. ==============================

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

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

    당신은 또한 할 수 있습니다 :

    SELECT order_no, SUM(order_price)
      FROM order_details
     GROUP BY order_no;
    

    모든 비 집계 열이 GROUP BY 절에 나열되어 있기 때문 작동합니다.

    당신이 뭔가를 할 수 있습니다 :

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

    이 쿼리는 정말 의미가없는 (또는 대부분의 아마 의미가 없다)하지만 '작업'것이다. 그것은 각각 별도의 주문 번호와 주문 가격 조합을 나열합니다, 그 가격과 관련된 최대 순서 항목 (번호)를 제공 할 것입니다. 순서에있는 모든 항목이 별개의 가격이있는 경우, 당신은 하나 개의 행 각각의 그룹이 될 겁니다. 순서대로 몇 가지 항목이 같은 가격이있는 경우 OTOH, (£ 0.99 각을 말한다) 다음 그룹은 그 함께하고 그 가격에 최대 주문 항목 수를 반환. (I 테이블을 가정하고있어 순서의 첫 번째 항목이 두 번째 항목 등 2, order_item 1 = 갖는다 (order_no 시리얼, order_item)의 기본 키가)

  2. ==============================

    2.

    SELECT * 
    FROM order_details 
    GROUP BY order_no
    

    위의 질의에서 당신은 때문에이 같은가없는 그룹을 오류를 던지는 것을의 모든 열을 선택하는 .. 방지 할 수있는 방법은 select 문에 모든 열이 GROUP BY 절에 있어야합니다 중 모든 열을 언급해야한다는 ..

     SELECT * 
        FROM order_details 
        GROUP BY order_no,order_details,etc
    

    등이 ORDER_DETAILS 테이블의 모든 열을 의미한다.

  3. ==============================

    3.GROUP BY 절을 사용하려면 집계 함수에서 열 절에 의해하지만 그룹에서 select 문에서 모든 열을 언급해야한다.

    GROUP BY 절을 사용하려면 집계 함수에서 열 절에 의해하지만 그룹에서 select 문에서 모든 열을 언급해야한다.

    당신은 당신이에 의한 파티션으로 그룹에 하나의 포트를 사용할 수 있습니다 조항으로 파티션을 사용하여 대신 그룹의이 작업을 수행 할 수 있습니다.

    당신은 또한 1 파티션으로 그것을 만들 수 있습니다

  4. ==============================

    4.이 문제를 방지하기 위해 공통 테이블 식 (CTE)를 사용합니다.

    이 문제를 방지하기 위해 공통 테이블 식 (CTE)를 사용합니다.

    다수의 열팽창 계수는 어쩌면 도움이 ... 내가 사용했을 경우를 붙여 편리 올

    with ranked_cte1 as  
    ( select r.mov_id,DENSE_RANK() over ( order by r.rev_stars desc )as rankked from ratings r  ),
    
    ranked_cte2 as  ( select * from movie where mov_id=(select mov_id from ranked_cte1 where rankked=7 ) )  select * from ranked_cte2
    
     select * from movie where mov_id=902
    
  5. from https://stackoverflow.com/questions/4611897/group-by-aggregate-function-confusion-in-sql by cc-by-sa and MIT license