문제

다음과 같은 모습을 보이는 열이 있습니다.

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

그리고 나는 그것을 내 그룹에 by clause에 넣고 싶지만, 이것은 열에 집계 함수가 있기 때문에 문제를 일으키는 것 같습니다. 다음과 같은 열 별칭으로 그룹화하는 방법이 있습니까? some_product 이 경우, 또는 이것을 하위 쿼리에 넣고 그룹에 넣어야합니까?

도움이 되었습니까?

해결책

내 생각에 당신은 정말로 원하지 않는 것입니다 GROUP BY some_product.

그만큼 답변 : "방법이 있습니까? GROUP BY 이 경우 some_product와 같은 열 별명이 있거나 하위 쿼리와 그룹에 넣어야합니까? " 이다: 당신은 할 수 없습니다 GROUP BY 열 별칭.

그만큼 SELECT 열 별명이 할당되는 조항은 이후까지 처리되지 않습니다. GROUP BY 절. 인라인보기 또는 공통 테이블 표현식 (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 ... 

다른 팁

하는 동안 섀넌의 대답 기술적으로 정확하며 과잉처럼 보입니다.

간단한 해결책은 요약을 외부에 두어야한다는 것입니다. case 성명. 이것은 트릭을 수행해야합니다.

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

기본적으로 이전 코드는 SQL에게 sum(X*Y) 각 라인에 대해 개별적으로 (그룹화 할 수없는 자체 답변으로 각 줄을 남겨 두십시오).

내가 쓴 코드 라인은 합계 제품을 취합니다. 이것이 당신이 원하는 것입니다.

다른 가치로 그룹화하고 있다면, 당신이 가진 것 대신

그대로 쓰십시오

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

만약, 오토, 당신은 원한다 group By 내부 표현, (col3*col4) 그 다음에

쓰기 group By 표현과 일치합니다 SUM...

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top