[sql] COUNTIF 집계 함수에 해당하는 SQL Server

GROUP BY특정 조건 (예 : 특정 열 값이 1 인 레코드 만 계산)을 기반으로 레코드를 계산하는 기능이 필요한 절을 사용 하여 쿼리를 작성하고 있습니다.

SELECT  UID,
        COUNT(UID) AS TotalRecords,
        SUM(ContractDollars) AS ContractDollars,
        (COUNTIF(MyColumn, 1) / COUNT(UID) * 100) -- Get the average of all records that are 1
FROM    dbo.AD_CurrentView
GROUP BY UID
HAVING  SUM(ContractDollars) >= 500000

COUNTIF()라는 네이티브 SQL 기능이 없기 때문에 선은 분명히 실패COUNTIF , 그러나 여기에서 아이디어는 MyColumn의 값 ‘1’이 모든 행의 비율을 결정하는 것입니다.

MS SQL 2005 환경에서이를 올바르게 구현하는 방법에 대한 생각이 있습니까?



답변

다음 과 같이 명령문 과 결합 된 SUM( COUNT! 아님)을 사용할 수 있습니다 CASE.

SELECT SUM(CASE WHEN myColumn=1 THEN 1 ELSE 0 END)
FROM AD_CurrentView

참고 : 내 테스트 NULL에서는 환경에 따라 다를 수 있지만 문제가되지 않았습니다. 다음과 같은 널을 처리 할 수 ​​있습니다.

SELECT SUM(CASE WHEN ISNULL(myColumn,0)=1 THEN 1 ELSE 0 END)
FROM AD_CurrentView


답변

나는 보통 조쉬가 추천 한 일을했지만 공유하고 싶은 약간의 대안을 브레인 스토밍하고 테스트했습니다.

COUNT (ColumnName)이 NULL을 계산하지 않는다는 사실을 이용하고 다음과 같은 것을 사용할 수 있습니다.

SELECT COUNT(NULLIF(0, myColumn))
FROM AD_CurrentView

NULLIF-전달 된 두 값이 동일한 경우 NULL을 반환합니다.

장점 : SUM () 표기법 대신 COUNT 개의 행으로 의도를 표현합니다. 단점 : 작동 방식이 명확하지 않습니다 ( “매직”은 일반적으로 나쁩니다).


답변

이 구문을 사용합니다. Josh 및 Chris의 제안과 동일하지만 ANSI를 준수하며 특정 데이터베이스 공급 업체와 관련이 없습니다.

select count(case when myColumn = 1 then 1 else null end)
from   AD_CurrentView


답변

조쉬의 대답에 덧붙여서

SELECT COUNT(CASE WHEN myColumn=1 THEN AD_CurrentView.PrimaryKeyColumn ELSE NULL END)
FROM AD_CurrentView

‘count’를 ‘sum’으로 변경하지 않고 SQL Server 2012에서 잘 작동했으며 동일한 논리를 다른 ‘조건부 집계’로 이식 할 수 있습니다. 예 : 조건에 따라 합산 :

SELECT SUM(CASE WHEN myColumn=1 THEN AD_CurrentView.NumberColumn ELSE 0 END)
FROM AD_CurrentView


답변

어때요?

SELECT id, COUNT(IF status=42 THEN 1 ENDIF) AS cnt
FROM table
GROUP BY table

CASE🙂 보다 짧음

때문에 작품 COUNT()null 값을 계산하지 않고,하지 않습니다 IF/ CASE는 null를 조건이 충족되지 않을 때 더있다ELSE 합니다.

나는 그것을 사용하는 것보다 낫다고 생각합니다 SUM().


답변

제품 별로는 아니지만 SQL 표준은


SELECT COUNT() FILTER WHERE <condition-1>,
COUNT() FILTER WHERE <condition-2>, ...
FROM ...

이 목적을 위해. 또는 그것을 닮은 것, 나는 모자의 꼭대기를 모른다.

물론 공급 업체는 독점 솔루션을 선호합니다.


답변

왜 이러지 않습니까?

SELECT count(1)
FROM AD_CurrentView
WHERE myColumn=1