골재 기능이있는 사례 문별 SQL 그룹
-
05-07-2019 - |
문제
다음과 같은 모습을 보이는 열이 있습니다.
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