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
'Programing' 카테고리의 다른 글
공급자 com.google.firebase.provider.FirebaseInitProvider를 가져올 수 없습니다 (0) | 2020.06.10 |
---|---|
iOS 앱에서 문서 폴더 안에 폴더 만들기 (0) | 2020.06.10 |
ACID 및 데이터베이스 트랜잭션은 어떻게 작동합니까? (0) | 2020.06.10 |
콘텐츠에는 id 속성이 'android.R.id.list'인 ListView가 있어야합니다. (0) | 2020.06.10 |
.Net 어셈블리의 PublicKeyToken 얻기 (0) | 2020.06.10 |