복붙노트

[SQL] COUNTIF 집계 함수의 SQL 서버에 해당

SQL

COUNTIF 집계 함수의 SQL 서버에 해당

난 단지 특정 조건에 따라 기록을 계산하는 능력을 필요로 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 기능이 없지만, 여기에 생각이 MyColumn의 값 '1'이 모든 행의 비율을 결정하는 것입니다 때문에 COUNTIF () 라인은 분명히 실패합니다.

제대로 MS SQL 2005 환경에서이를 구현하는 방법에 대한 어떤 생각?

해결법

  1. ==============================

    1.당신은 (! COUNT되지 않음)과 같은 CASE 문 결합 된 SUM을 사용할 수 있습니다 :

    당신은 (! COUNT되지 않음)과 같은 CASE 문 결합 된 SUM을 사용할 수 있습니다 :

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

    참고 :이 환경에 의존 할 수 있지만 내 자신의 테스트 NULL을에서이 문제가 아니었다. 당신은 같은 널 (null)을 처리 할 수 ​​:

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

    2.나는 보통 조쉬 권장하지만, 브레인 스토밍과 내가 공유처럼 느꼈다 약간 날조 한 대안을 테스트 무엇.

    나는 보통 조쉬 권장하지만, 브레인 스토밍과 내가 공유처럼 느꼈다 약간 날조 한 대안을 테스트 무엇.

    당신은 COUNT (의 ColumnName가) 널 (null)을 계산하고,이 같은 사용 무언가하지 않는다는 사실을 이용할 수 있습니다 :

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

    NULLIF는 - 값 전달 된 두가 같은 경우 NULL을 반환합니다.

    장점 : 표현하여 대신 SUM () 표기법을 갖는 행을 계산하는 의도. 단점 : 명확로가 작동하지 않음 방법 ( "마법"보통 나쁜).

  3. ==============================

    3.나는이 구문을 사용합니다. 그것은 조쉬와 크리스의 제안과 동일 달성하지만, 장점으로는 ANSI의 규격 및 특정 데이터베이스 공급 업체에 연결되지 않습니다.

    나는이 구문을 사용합니다. 그것은 조쉬와 크리스의 제안과 동일 달성하지만, 장점으로는 ANSI의 규격 및 특정 데이터베이스 공급 업체에 연결되지 않습니다.

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

    4.조쉬의 대답에 추가

    조쉬의 대답에 추가

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

    변경하지 않고 (SQL 서버 2012 년) 잘 나를 위해 일한 '개수'에 '합'과 같은 논리는 다른 '조건부 집계'에 이식입니다. 예컨대, 조건에 따라 합산 :

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

    5.방법에 대한

    방법에 대한

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

    CASE보다 짧은 :)

    COUNT 때문에 작품 () 널 (null) 값을 계산하고, IF / CASE의 경우는 null 조건이 충족되지 않을 때 더 ELSE 존재하지 않습니다.

    나는 () SUM을 사용하는 것보다 더 나은 것 같아요.

  6. ==============================

    6.아니 제품 별하지만, SQL 표준 제공

    아니 제품 별하지만, SQL 표준 제공

    SELECT COUNT () FILTER WHERE <조건 1>        COUNT () FILTER WHERE <조건 2>, ...   FROM ...

    이 목적을 위해. 또는 밀접하게 유사 뭔가 것을, 내 모자의 상단을 모른다.

    물론 업체들은 독점 솔루션 스틱을 선호합니다.

  7. ==============================

    7.왜 이런?

    왜 이런?

    SELECT count(1)
    FROM AD_CurrentView
    WHERE myColumn=1
    
  8. ==============================

    8.내 SELECT 컬럼의 일환으로 각 항목 내 결과에 표시된 횟수의 모방 %가 내 경우에는 () COUNTIF를 사용했다.

    내 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
    

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

  9. ==============================

    9.

    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
    
  10. from https://stackoverflow.com/questions/582637/sql-server-equivalent-of-a-countif-aggregate-function by cc-by-sa and MIT license