Programing

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

lottogame 2020. 6. 10. 23:03
반응형

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

필자의 경우에는 SELECT 열의 일부로 COUNTIF ()를 사용하고 각 항목이 결과에 나타나는 횟수의 %를 모방해야했습니다.

그래서 나는 이것을 사용했다 ...

SELECT COL1, COL2, ... ETC
       (1 / SELECT a.vcount 
            FROM (SELECT vm2.visit_id, count(*) AS vcount 
                  FROM dbo.visitmanifests AS vm2 
                  WHERE vm2.inactive = 0 AND vm2.visit_id = vm.Visit_ID 
                  GROUP BY vm2.visit_id) AS a)) AS [No of Visits],
       COL xyz
FROM etc etc

물론 디스플레이 요구 사항에 따라 결과를 포맷해야합니다.


SELECT COALESCE(IF(myColumn = 1,COUNT(DISTINCT NumberColumn),NULL),0) column1,
COALESCE(CASE WHEN myColumn = 1 THEN COUNT(DISTINCT NumberColumn) ELSE NULL END,0) AS column2
FROM AD_CurrentView

참고 URL : https://stackoverflow.com/questions/582637/sql-server-equivalent-of-a-countif-aggregate-function

반응형