“주문이 몇 건이야?”, “배송일이 입력된 건 몇 개야?” 같은 질문에는 개수를 세는 함수가 필요합니다. DAX에는 COUNT, COUNTA, COUNTROWS, DISTINCTCOUNT처럼 이름이 비슷한 함수가 여럿 있어서 처음에는 뭘 골라야 할지 헷갈립니다. 이 글은 그중 COUNT를 중심으로, 나머지와 어디서 갈리는지, 그리고 실무에서 자주 쓰는 세 가지 상황(입력률 점검, 조건부 개수, 식 결과 개수)까지 정리합니다.
COUNT는 이런 함수입니다
COUNT( <열> )
인수는 열 하나뿐이고, 그 열에서 값이 들어 있는 행의 수를 셉니다. 반환값은 정수입니다. Microsoft 문서에 따르면 숫자, 날짜, 문자열이 들어 있는 행을 세고, 빈 값은 건너뜁니다. 센 행이 하나도 없으면 0이 아니라 빈 값을 돌려줍니다.
Power BI Desktop에서 측정값으로 만들기
메뉴 이름은 Power BI 버전과 언어 설정에 따라 조금 다를 수 있다는 점을 먼저 말씀드립니다. 일반적인 순서는 이렇습니다.
- 보고서 보기에서 오른쪽 필드 창의 테이블(예: 주문)을 선택합니다.
- 상단 리본에서 “새 측정값”(영문판은 New measure)을 누릅니다.
- 수식 입력줄에
배송건수 = COUNT( 주문[배송일] )처럼 이름과 식을 적고 Enter를 누릅니다. - 만든 측정값을 카드 시각화나 표에 올려 값을 확인합니다. 담당자 같은 열과 함께 표에 올리면 줄마다 어떻게 나뉘는지 볼 수 있습니다.
예제 데이터
설명하려고 만든 가상 데이터입니다. 일부러 빈 칸을 몇 개 넣었습니다. 결과는 Power BI에서 돌린 화면이 아니라 직접 세어서 적은 값이니, 같은 식을 본인 데이터에 적용해서 확인해 보세요.
| 주문 | 담당자 | 배송일 | 승인(TRUE/FALSE) | 금액 |
|---|---|---|---|---|
| 1 | 김 | 3/2 | TRUE | 30 |
| 2 | 이 | (빈 값) | FALSE | 20 |
| 3 | (빈 값) | 3/5 | TRUE | 50 |
| 4 | 김 | 3/7 | TRUE | 10 |
| 5 | 박 | (빈 값) | FALSE | 40 |
기본 동작
배송건수 = 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 문서에 적혀 있습니다. 측정값에서는 쓸 수 있습니다.
- 지역 설정에 따라 인수 구분자가 쉼표 대신 세미콜론일 수 있습니다. 식을 붙여 넣었는데 오류가 난다면 먼저 확인해 보세요.
자주 하는 실수
- 참/거짓 열에 COUNT: 지원하지 않는 형식입니다. COUNTA나 조건을 건 COUNTROWS를 쓰세요.
- 행 수를 세려고 아무 열이나 COUNT: 그 열이 비어 있는 행은 빠집니다. 전체 행 수는 COUNTROWS입니다.
- 빈 값과 빈 문자열을 같다고 생각: COUNT는 둘을 다르게 취급합니다.
- 중복 값을 고려하지 않고 “고객 수”를 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개의 생각