복붙노트

[SQL] 집계 함수와 SQL GROUP BY CASE 문

SQL

집계 함수와 SQL GROUP BY CASE 문

내가 이렇게 보이는 열이 :

CASE
    WHEN col1 > col2 THEN SUM(col3*col4)
    ELSE 0
END AS some_product

그리고 BY 절 내 그룹에 넣어 싶지만, 열에 집계 함수가 있기 때문에이 문제를 일으킬 것 같다. GROUP 할 수있는 방법은이 경우 some_product으로 열 별칭에 의해 있는가, 아니면 그에 하위 쿼리 및 그룹에 넣고해야합니까?

해결법

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

    1.내 생각 엔 당신이 정말로 GROUP BY의 some_product로하지 않을 것입니다.

    내 생각 엔 당신이 정말로 GROUP BY의 some_product로하지 않을 것입니다.

    에 대한 대답은 "거기는이 경우 some_product로 열 별명으로 GROUP하는 방법입니다, 아니면 그에 하위 쿼리 및 그룹에 넣고해야합니까?" 입니다 : 당신은 할 수없는 열 별칭 BY GROUP.

    열 별칭 할당 된 SELECT 절, BY 절 GROUP 때까지 처리되지 않는다. 인라인 뷰 또는 공통 테이블 표현식 (CTE)는 그룹화에 대한 결과를 사용할 수 있도록하는 데 사용할 수 있습니다.

    인라인보기 :

    select ...
    from (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product
       from ...
       group by col1, col2 ... ) T
    group by some_product ...
    

    CTE :

    with T as (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product
       from ...
       group by col1, col2 ... )
    select ...
    from T
    group by some_product ... 
    
  2. ==============================

    2.섀넌의 대답은 기술적으로 정확하지만, 그것은 잔인한 사람처럼 보인다.

    섀넌의 대답은 기술적으로 정확하지만, 그것은 잔인한 사람처럼 보인다.

    간단한 솔루션은 case 문으로 당신의 합계 외부를 넣을 필요가있다. 이 트릭을 수행해야합니다

    sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product
    

    기본적으로, 기존 코드 (그룹화 할 수없는 자신의 대답은 각 행을 떠나는) 개별적으로 각 행의 합 (X * Y)을 실행하는 SQL을 알려줍니다.

    내가 작성한 코드 라인은 당신이 원하는 어떤 합 제품을합니다.

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

    3.당신은 몇 가지 다른 값으로 그룹화하는 경우, 대신 당신은 무엇을,

    당신은 몇 가지 다른 값으로 그룹화하는 경우, 대신 당신은 무엇을,

    로 쓰기

    Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct
    

    , OTOH, 당신은 내부 표현으로 그룹화 할 경우 (COL3 * col4)를

    / O를 SUM w 표현과 일치하는함으로써 그룹을 쓰기 ...

    Select Sum(Case When col1 > col2 Then col3*col4 Else 0 End) as SumSomeProduct
    From ...
    
    Group By Case When col1 > col2 Then col3*col4 Else 0 End 
    

    마지막으로, 당신은 실제 집계하여 그룹화 할 경우

    Select SumSomeProduct, Count(*), <other aggregate functions>
    From (Select <other columns you are grouping By>, 
          Sum(Case When col1 > col2 
              Then col3*col4 Else 0 End) as SumSomeProduct
          From Table
          Group By <Other Columns> ) As Z
    Group by SumSomeProduct
    
  4. from https://stackoverflow.com/questions/1208854/sql-group-by-case-statement-with-aggregate-function by cc-by-sa and MIT license