안녕하세요 데이터분석가 먼지입니다.
오늘은 PowerBI를 사용해 고객사 HR 대시보드 구축했던 경험과 함께 시각화의 유동적인 기능 측면에서 PowerBI DAX함수에 대해 정리해보겠습니다.
1. 데이터가 클릭에 따라 움직이는 원리
대시보드에서 시각화된 데이터를 클릭했을 경우 그래프에 나타나게 됩니다. 슬라이서를 통해 필터를 구성할 때도 있고, 표에서 어떤 항목을 클릭했을 때, 그 데이터만 시각화 그래프에 나타나게 됩니다. 인터넷에서 다운받았던 powerBI 파일을 예시로 설명하겠습니다.
ex. 처음 페이지 & 1월 달 데이터를 클릭 시
데이터클릭에 따라, 다른 시각화 객체(카드, 표)의 데이터도 바뀌는 것을 볼 수 있습니다.


DAX함수 관점에서 데이터가 동적으로 움직이는 원리는 바로 '필터링' 입니다. 행렬 데이터에서
* 행 Category, Account
* 열 Jan
총 3가지의 필터링이 걸리면서 다른 데이터의 객체도 해당하는 데이터만 나타나게 됩니다. 즉, 다른 시각화 객체에서도 Category = 'Revenue', Account = 'Product Sales', Month = 'Jan' 3가지의 필터링이 걸린 결과가 나오게 되는 거죠. 이 원리를 알아야 시각화에서 기능적으로 표현하고 싶은 걸 표현할 수 있습니다.
실제 문제상황. 적은 수치의 계정항목이 잘 표현되지 않는 문제.
제가 이번 프로젝트에서 작업 중 고생했던 부분이 전체 중 일부만을 막대그래프로 표현하는 부분이었습니다. 인건비에 대한 항목들을 전월, 계획, 당월 수치로 행렬로 표현해야 했고, '기본급', '식대', 야간수당' 등 각 세부항목을 클릭시 비교할 수 있게 막대그래프로 표현하려 했었습니다.
여러개의 계정항목 중 세부적인 값들이 클릭시 표현되길 바랬었는데, 전체 값이 막대그래프에 표현되면서 원하는 시각화를 할 수 없었습니다. 아래 그림과 '기본급' 같은 큰 값은 잘 표현되는 반면, '운전수당', '자격수당' 같은 작은 수치의 계정은 잘 표현이 안되었죠.


해결. DAX 함수 행, 열 필터링
이럴 경우 필터링을 잘 활용하면, 아래와 같이 전체값이 아닌 세부적인 값만 나오게 만들 수 있습니다. 전체 몇십억 중 단 300만원이라는 수치도 계획,전월에 대해 잘 비교될 수 있도록 시각화 할 수 있었습니다. 해당 로직을 밝힐 순 없으나 행,열 필터링 로직을 잘 활용하면 원하는 시각화를 할 수 있다는 점을 알아주시면 좋을 것 같습니다.

2. 필터링 DAX함수 정리
따라서 제가 생각하기에 가장 중요한 DAX함수 모델링은 '필터링을 잘 걸리게 만들었냐' 입니다. PowerBI의 기본적인 함수들을 정리해보겠습니다.
(1) 전체 중 필터링
Calculate함수 안에서 사용합니다. 가장 기본적으로 간단하게 아래와 같이 사용합니다.
# 빨간 상품의 개수
Quantity_red =
CALCULATE(SUM(Sales[Quantity]), Sales[Color] = "Red")
여러번 사용해본 결과, 복잡한 필터링의 경우 잘 작동하지 않았습니다. 해당 객체가 여러번 사용될 것 같고, 복잡하다면 KEEPFILTERS 함수를 추천합니다. 사용시 기존 필터를 유지하며 추가 필터를 적용할 수 있습니다.
# 필터링 방식
Quantity_red =
CALCULATE(
SUM(Sales[Quantity]),
KEEPFILTERS(Sales[Color] = "Red")
)
(2) 클릭된 객체를 표현하는 함수
가장 기본적으로 SELECTEDVALUE 함수를 사용합니다.
# 클릭된 기간, 항목
VAR SelectedItem = SELECTEDVALUE ( Sales[항목] )
VAR SelectedPeriod = SELECTEDVALUE ( Term_table[기간]) # 전월, 당월, 계획
- VALUES / SELECTEDVALUE: 실제 선택된 값 반환
- HASONEFILTER: 단일 필터 적용 여부
- ISFILTERED / ISCROSSFILTERED: 필터링 여부 확인
만약 시각적 객체가 잘 표현되지 않는다면, 위 식들에서 필터링이 제대로 안 걸린 것이기 때문에 상황에 맞는 함수를 쓰면 좋습니다.
(3) IF 문
엑셀 함수에서 쓰는 IF 문과 동일합니다. 조건, 조건 부합시, 조건 부합하지 않을시 순서로 적어주는 형식입니다.
합격여부 =
IF(Students[Score] >= 60, "합격", "불합격")
다만, powerBI 상 IF문을 여러가지 경우로 써야 할 경우가 많기 때문에, SWITCH함수도 많이 사용하는 것 같습니다.
# 함수식
SWITCH(<표현식>, <값1>, <결과1>, <값2>, <결과2>, …, [기본값])
# 예시
요일명 =
SWITCH(WEEKDAY(Sales[OrderDate]),
1, "일요일",
2, "월요일",
3, "화요일",
4, "수요일",
5, "목요일",
6, "금요일",
7, "토요일",
"알 수 없음"
)
3. 느낀점
끝으로 PowerBI를 사용하며 느낀점을 조금 더 정리하면
- 페이지간 필터 동기화는 사용하지 않는게 좋았습니다. 페이지가 복잡해지니 필터 함수가 고장나는 경우가 있었습니다. 아무런 필터가 적용되지 않아도 적용된 상태로 데이터가 나타나는 경우가 있었습니다.. (powerBI상 오류라고 생각되네요)
- DAX함수는 최대한 심플하게 작성하는 게 좋은 것 같습니다. DAX함수가 복잡하면 기능적 오류 수정하는데 오래 걸리고, 유지보수에 시간이 많이 걸립니다.
- SQL로 최대한 데이터를 잘 모델링한 뒤 심플하게 시각화에 사용하는 것이 좋은 것 같습니다!
다음 포스팅은 PowerBI 자동화에 사용한 Airflow관련해 포스팅해 보겠습니다.
감사합니다 :)
'데이터분석' 카테고리의 다른 글
| ERP DB 데이터 구조 파악 경험 (0) | 2025.10.12 |
|---|---|
| 데이터 검증법, 엑셀을 통한 중복데이터 및 데이터 차이 찾기 (1) | 2025.07.06 |
| 데이터 검증 경험, 결과값이 달랐던 3가지 이유 (1) | 2025.06.23 |
| [pandas] 한달 전 월말 날짜 구하기 (0) | 2023.03.17 |