DAX COUNT 함수 정리: 값이 있는 행만 세는 방법과 COUNTA, COUNTROWS와의 차이

“주문이 몇 건이야?”, “배송일이 입력된 건 몇 개야?” 같은 질문에는 개수를 세는 함수가 필요합니다. DAX에는 COUNT, COUNTA, COUNTROWS, DISTINCTCOUNT처럼 이름이 비슷한 함수가 여럿 있어서 처음에는 뭘 골라야 할지 헷갈립니다. 이 글은 그중 COUNT를 중심으로, 나머지와 어디서 갈리는지, 그리고 실무에서 자주 쓰는 세 가지 상황(입력률 점검, 조건부 개수, 식 결과 개수)까지 정리합니다.

COUNT는 이런 함수입니다

COUNT( <열> )

인수는 열 하나뿐이고, 그 열에서 값이 들어 있는 행의 수를 셉니다. 반환값은 정수입니다. Microsoft 문서에 따르면 숫자, 날짜, 문자열이 들어 있는 행을 세고, 빈 값은 건너뜁니다. 센 행이 하나도 없으면 0이 아니라 빈 값을 돌려줍니다.

Power BI Desktop에서 측정값으로 만들기

메뉴 이름은 Power BI 버전과 언어 설정에 따라 조금 다를 수 있다는 점을 먼저 말씀드립니다. 일반적인 순서는 이렇습니다.

  1. 보고서 보기에서 오른쪽 필드 창의 테이블(예: 주문)을 선택합니다.
  2. 상단 리본에서 “새 측정값”(영문판은 New measure)을 누릅니다.
  3. 수식 입력줄에 배송건수 = COUNT( 주문[배송일] )처럼 이름과 식을 적고 Enter를 누릅니다.
  4. 만든 측정값을 카드 시각화나 표에 올려 값을 확인합니다. 담당자 같은 열과 함께 표에 올리면 줄마다 어떻게 나뉘는지 볼 수 있습니다.

예제 데이터

설명하려고 만든 가상 데이터입니다. 일부러 빈 칸을 몇 개 넣었습니다. 결과는 Power BI에서 돌린 화면이 아니라 직접 세어서 적은 값이니, 같은 식을 본인 데이터에 적용해서 확인해 보세요.

주문담당자배송일승인(TRUE/FALSE)금액
1김3/2TRUE30
2이(빈 값)FALSE20
3(빈 값)3/5TRUE50
4김3/7TRUE10
5박(빈 값)FALSE40

기본 동작

배송건수 = COUNT( 주문[배송일] )

배송일이 채워진 행은 1, 3, 4번 주문이라 결과는 3입니다. 담당자 열에 쓰면 이렇습니다.

담당자입력건수 = COUNT( 주문[담당자] )

빈 값이 아닌 행은 김, 이, 김, 박 네 줄이라 4입니다. 문자열 열에도 쓸 수 있습니다.

빈 값과 빈 문자열은 다르다

DAX Guide에 따르면 COUNT는 빈 값은 세지 않지만 빈 문자열(“”)은 센다고 합니다. 화면에서는 둘 다 비어 보여서 구분이 어렵지만, 원본 데이터를 어떻게 불러왔느냐에 따라 한쪽으로 들어가 있을 수 있습니다. 개수가 예상보다 많이 나오면 이 차이를 의심해 볼 만합니다.

실무 시나리오 1: 입력 완성도 점검

데이터를 받았을 때 가장 먼저 확인하는 것 중 하나가 “필수 항목이 얼마나 채워져 있는가”입니다. 배송일이 입력된 비율과 빠진 건수를 구해 보겠습니다.

배송일입력률 =
DIVIDE( COUNT( 주문[배송일] ), COUNTROWS( 주문 ) )

배송일미입력건수 =
COUNTROWS( 주문 ) - COUNT( 주문[배송일] )

배송일이 있는 주문은 3건, 전체 주문은 5건이니 입력률은 3 ÷ 5 = 60%이고, 미입력은 5 – 3 = 2건(2번과 5번 주문)입니다. 이렇게 “전체 행 수”와 “값이 있는 행 수”를 비교하는 방식은 데이터 품질 점검에 자주 쓰입니다. 여기서 전체 행 수에는 COUNTROWS를 쓰는데, 이유는 뒤에서 설명합니다.

실무 시나리오 2: 조건과 함께 세기

“김 담당자가 배송까지 끝낸 건수”는 CALCULATE로 조건을 바꿔서 셉니다.

김담당배송건수 =
CALCULATE(
    COUNT( 주문[배송일] ),
    주문[담당자] = "김"
)

담당자가 김인 행은 1번, 4번이고 둘 다 배송일이 있어서 2입니다. CALCULATE가 조건을 바꾸는 원리는 CALCULATE 함수 글에 정리해 두었습니다.

실무 시나리오 3: 식의 결과를 세기 (COUNTX)

COUNT는 열 하나만 받습니다. “금액이 30 이상인 주문 수”처럼 조건식의 결과를 세려면 COUNTX를 쓸 수 있습니다. DAX Guide에 따르면 COUNTX는 테이블의 각 행에서 식을 계산하고, 빈 값이 아닌 결과의 개수를 셉니다. 이 성질을 이용하면 이렇게 쓸 수 있습니다.

큰주문건수_X =
COUNTX(
    주문,
    IF( 주문[금액] >= 30, 1 )
)

IF에 else 값을 주지 않으면 조건이 거짓일 때 빈 값이 나옵니다. 그래서 금액이 30 이상인 1번(30), 3번(50), 5번(40)만 1을 돌려주고 나머지는 빈 값이 되어, 결과는 3입니다. 다만 같은 결과를 더 직관적으로 얻는 방법이 있습니다.

큰주문건수 =
COUNTROWS( FILTER( 주문, 주문[금액] >= 30 ) )

이쪽이 “조건에 맞는 행의 수”라는 의도가 바로 읽힙니다. COUNTX는 센 값이 “식의 결과”일 때, 예를 들어 계산한 값이 비어 있지 않은 경우만 세고 싶을 때 쓰는 편이 자연스럽습니다. DAX Guide는 COUNT가 열 하나에 쓴 COUNTX의 줄임 표현이라고 설명합니다. 즉 COUNT( 주문[배송일] )과 COUNTX( 주문, 주문[배송일] )은 같은 결과(3)를 냅니다.

TRUE/FALSE 열은 COUNTA로

승인 열처럼 참/거짓이 들어 있는 열은 COUNT가 지원하지 않는다고 Microsoft 문서가 안내합니다. 이럴 때는 COUNTA를 씁니다.

승인열값개수 = COUNTA( 주문[승인] )

결과는 5입니다. 모든 행에 TRUE나 FALSE가 들어 있기 때문입니다. 이 5는 “승인된 건수”가 아니라 “승인 여부가 기록된 행 수”라는 점에 주의하세요. 참인 행만 세고 싶다면 조건을 걸어야 합니다.

승인건수 =
CALCULATE(
    COUNTROWS( 주문 ),
    주문[승인] = TRUE()
)

1, 3, 4번이 참이라 결과는 3입니다. COUNTX와 COUNTAX의 관계도 같습니다. DAX Guide에 따르면 COUNTAX는 참/거짓도 처리하고 COUNTX는 처리하지 못합니다. COUNTA는 별도 글에서 자세히 다룹니다.

COUNT, COUNTA, COUNTROWS 구분하기

함수무엇을 세나예제 결과
COUNT( 열 )값이 있는 행(숫자, 날짜, 문자열). 참/거짓 열은 불가배송일 3
COUNTA( 열 )값이 있는 행. 참/거짓도 가능승인 5
COUNTROWS( 테이블 )테이블의 모든 행(값이 비어 있어도 센다)5
COUNTX( 테이블, 식 )행마다 계산한 식의 결과 중 빈 값이 아닌 것큰 주문 3
DISTINCTCOUNT( 열 )서로 다른 값의 개수. 빈 값 처리가 따로 있어서 별도 글에서 다룸–

DAX Guide는 숫자나 날짜, 문자열 열에서는 COUNT와 COUNTA가 같은 결과를 낸다고 설명합니다. 달라지는 지점은 참/거짓 열뿐입니다.

행 수를 세려면 COUNTROWS를 쓰라는 권고

Microsoft 문서에는 “COUNT 대신 COUNTROWS를 쓰라”는 모범 사례 문서가 따로 있습니다. 두 함수는 세는 열에 빈 값이 없으면 같은 결과를 내지만, 문서는 테이블의 행 수를 세는 것이 목적이라면 COUNTROWS를 쓰라고 권합니다. 이유는 세 가지로 정리됩니다.

  • 더 효율적이라서 성능이 낫다
  • 테이블의 어떤 열에 빈 값이 있어도 영향을 받지 않는다
  • 식의 의도가 분명해서 읽는 순간 무슨 뜻인지 알 수 있다
총주문건수 = COUNTROWS( 주문 )   -- 5
배송입력건수 = COUNT( 주문[배송일] ) -- 3

두 값의 차이가 “배송일이 비어 있는 주문 수”입니다. 시나리오 1에서 전체 행 수 자리에 COUNTROWS를 쓴 이유가 이것입니다. 만약 전체 행 수를 구하려고 담당자 열에 COUNT를 썼다면 4가 나와서 입력률이 3 ÷ 4 = 75%로 잘못 계산됐을 것입니다. SQLBI의 DAX 함수 소개 영상 페이지도 COUNT는 빈 값을 건너뛰는 함수라고 설명하며, 식 기반으로 세려면 COUNTX 계열을 쓴다고 구분합니다.

내부 동작

DAX Guide에 따르면 COUNT는 내부적으로 COUNTX를 실행하는 것과 같고 성능 차이는 없습니다. 같은 뜻을 아래처럼 풀어 쓸 수도 있습니다.

CALCULATE( COUNTROWS( 주문 ), NOT ISBLANK( 주문[배송일] ) )

두 식 모두 배송일이 비어 있지 않은 행의 수를 구합니다.

쓰지 말아야 할 때

  • 테이블의 전체 행 수가 필요할 때: 열이 비어 있는 행이 빠지므로 COUNTROWS를 쓰세요.
  • 참/거짓 열을 셀 때: COUNT는 지원하지 않습니다. COUNTA를 쓰세요.
  • 서로 다른 값의 수가 필요할 때: COUNT는 중복도 모두 셉니다. DISTINCTCOUNT가 맞습니다.
  • “참인 건수”가 필요할 때: 열에 값이 있는 행을 세는 것이므로 조건을 걸어야 합니다.

알아둘 점

  • COUNT의 인수는 열 하나뿐입니다. 테이블을 넣을 수 없습니다.
  • 센 행이 없으면 0이 아니라 빈 값이 나옵니다. 표에 0으로 보이게 하고 싶다면 별도 처리가 필요합니다.
  • DirectQuery 모드에서는 계산 열이나 행 수준 보안 규칙 안에서 쓸 수 없다고 Microsoft 문서에 적혀 있습니다. 측정값에서는 쓸 수 있습니다.
  • 지역 설정에 따라 인수 구분자가 쉼표 대신 세미콜론일 수 있습니다. 식을 붙여 넣었는데 오류가 난다면 먼저 확인해 보세요.

자주 하는 실수

  1. 참/거짓 열에 COUNT: 지원하지 않는 형식입니다. COUNTA나 조건을 건 COUNTROWS를 쓰세요.
  2. 행 수를 세려고 아무 열이나 COUNT: 그 열이 비어 있는 행은 빠집니다. 전체 행 수는 COUNTROWS입니다.
  3. 빈 값과 빈 문자열을 같다고 생각: COUNT는 둘을 다르게 취급합니다.
  4. 중복 값을 고려하지 않고 “고객 수”를 COUNT로 계산: 같은 고객이 여러 행에 있으면 행 수만큼 세어집니다.

정리

COUNT는 “그 열에 값이 들어 있는 행”을 세고, 테이블의 전체 행은 COUNTROWS, 참/거짓 열은 COUNTA, 식의 결과는 COUNTX, 서로 다른 값의 수는 DISTINCTCOUNT로 나눠 쓰면 됩니다. 가장 흔한 실수는 행 수를 세려고 아무 열에나 COUNT를 쓰는 것이니, 질문이 “행이 몇 개인가”인지 “값이 입력된 행이 몇 개인가”인지부터 구분해 보세요. 예제는 가상 데이터이니 본인 모델의 열 이름으로 바꿔 직접 확인해 보시고, 동작은 버전에 따라 다를 수 있어 공식 문서도 함께 보시길 권합니다.

참고한 자료

  • Microsoft Learn, COUNT function (DAX): https://learn.microsoft.com/en-us/dax/count-function-dax
  • Microsoft Learn, Use COUNTROWS instead of COUNT in DAX: https://learn.microsoft.com/en-us/dax/best-practices/dax-countrows
  • Microsoft Learn, Aggregation functions (DAX): https://learn.microsoft.com/en-us/dax/aggregation-functions-dax
  • DAX Guide, COUNT: https://dax.guide/count/
  • DAX Guide, COUNTX: https://dax.guide/countx/
  • SQLBI, COUNT, COUNTA, COUNTAX, COUNTX: https://www.sqlbi.com/tv/count-counta-countax-countx-dax-guide/

“DAX COUNT 함수 정리: 값이 있는 행만 세는 방법과 COUNTA, COUNTROWS와의 차이”에 대한 3개의 생각

댓글 남기기