Power BI 치트시트
마지막 업데이트
측정값, 열, 테이블
측정값은 시각적 개체의 셀마다 계산되고, 계산 열은 행마다 한 번 계산되어 저장됩니다.
| 용도 | DAX |
|---|---|
| 측정값 만들기 | Total Sales = SUM ( Sales[Amount] ) |
| 계산 열 만들기(행마다 값 하나) | Line Total = Sales[Quantity] * Sales[Unit Price] |
| 계산 테이블 만들기 | Top Customers = TOPN ( 10, Customer, [Total Sales] ) |
| 열 참조하기: 테이블 이름 다음에 대괄호로 감싼 열 이름 | Sales[Amount] |
| 공백이 있거나 예약어인 테이블 이름을 따옴표로 감싸기 | 'Date'[Date] |
| 측정값 참조하기: 대괄호만 | [Total Sales] |
| 측정값 안에서 다른 측정값 사용하기 | Average Price = DIVIDE ( [Total Sales], [Total Units] ) |
집계 함수
모두 현재 필터 컨텍스트에서 열을 요약합니다.
| 용도 | DAX |
|---|---|
| 열 합계 | SUM ( Sales[Amount] ) |
| 열 평균 | AVERAGE ( Sales[Amount] ) |
| 가장 작은 값 | MIN ( Sales[Order Date] ) |
| 가장 큰 값 | MAX ( Sales[Order Date] ) |
| 테이블의 행 수 세기 | COUNTROWS ( Sales ) |
| 열에서 공백이 아닌 값 세기 | COUNT ( Sales[Amount] ) |
| 고유 값 개수 세기 | DISTINCTCOUNT ( Sales[Customer Key] ) |
| 안전하게 나누기: 분모가 0이면 오류 대신 공백 | DIVIDE ( [Total Sales], [Total Units] ) |
| 분모가 0일 때 표시할 값을 지정해 나누기 | DIVIDE ( [Profit], [Total Sales], 0 ) |
반복기(X 함수)
테이블을 한 행씩 돌며 행마다 식을 계산한 다음 그 결과를 집계합니다.
| 용도 | DAX |
|---|---|
| 행마다 곱한 다음 합계 | SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| 행별 결과의 평균 | AVERAGEX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| 행별 결과의 최댓값 | MAXX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| 고객별 측정값의 평균 | AVERAGEX ( VALUES ( Customer[Customer Key] ), [Total Sales] ) |
| 관련 테이블의 열을 식에서 사용하기 | SUMX ( Sales, Sales[Quantity] * RELATED ( Product[Unit Cost] ) ) |
| 조건을 통과한 행 세기 | COUNTROWS ( FILTER ( Sales, Sales[Quantity] >= 3 ) ) |
| 모든 제품을 측정값으로 순위 매기기 | RANKX ( ALL ( Product[Product] ), [Total Sales] ) |
| 동점 뒤에 순위를 건너뛰지 않기(1, 1, 2) | RANKX ( ALL ( Product[Product] ), [Total Sales], , DESC, DENSE ) |
| 값을 이어 하나의 텍스트로 만들기 | CONCATENATEX ( VALUES ( Product[Category] ), Product[Category], ", " ) |
CALCULATE와 필터 함수
CALCULATE는 필터를 바꿔서 식을 계산합니다. 같은 열에 대한 필터는 기존 필터를 대체하고, 다른 열에 대한 필터는 AND로 결합됩니다.
| 용도 | DAX |
|---|---|
| 값 하나로 필터링 | CALCULATE ( [Total Sales], Product[Category] = "Bikes" ) |
| 값 목록으로 필터링 | CALCULATE ( [Total Sales], Product[Color] IN { "Red", "Blue" } ) |
| 필터 두 개(AND) | CALCULATE ( [Total Sales], Product[Color] = "Red", Store[Country] = "Spain" ) |
| 두 열에 걸친 OR | CALCULATE ( [Total Sales], FILTER ( ALL ( Product[Color], Product[Brand] ), Product[Color] = "Red" || Product[Brand] = "Contoso" ) ) |
| 측정값으로 필터링 | CALCULATE ( [Total Sales], FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) ) |
| 기존 필터를 유지하고 교집합 구하기 | CALCULATE ( [Total Sales], KEEPFILTERS ( Product[Color] IN { "Red", "Blue" } ) ) |
| 열의 필터 제거 | CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) |
| 테이블의 모든 필터 제거 | CALCULATE ( [Total Sales], ALL ( Product ) ) |
| 일부 열을 빼고 테이블의 모든 필터 제거 | CALCULATE ( [Total Sales], ALLEXCEPT ( Store, Store[Country] ) ) |
| 슬라이서 선택은 유지하고 시각적 개체 자체의 행은 무시 | CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) |
| 비활성 관계 사용 | CALCULATE ( [Total Sales], USERELATIONSHIP ( Sales[Ship Date], 'Date'[Date] ) ) |
| 측정값 하나에서만 필터를 양방향으로 전달 | CALCULATE ( COUNTROWS ( Customer ), CROSSFILTER ( Sales[Customer Key], Customer[Customer Key], BOTH ) ) |
| 관계가 없는 테이블로 필터링 | CALCULATE ( [Total Sales], TREATAS ( VALUES ( Budget[Category] ), Product[Category] ) ) |
시간 인텔리전스
날짜 테이블이 필요합니다. 하루에 한 행씩 빠진 날 없이 들어 있고, 날짜 테이블로 표시된 테이블입니다.
| 용도 | DAX |
|---|---|
| 연간 누계 | TOTALYTD ( [Total Sales], 'Date'[Date] ) |
| 연간 누계(6월 30일에 끝나는 회계연도) | TOTALYTD ( [Total Sales], 'Date'[Date], "6/30" ) |
| CALCULATE 안에서 연간 누계 | CALCULATE ( [Total Sales], DATESYTD ( 'Date'[Date] ) ) |
| 분기 누계 | TOTALQTD ( [Total Sales], 'Date'[Date] ) |
| 월간 누계 | TOTALMTD ( [Total Sales], 'Date'[Date] ) |
| 전년 동기 | CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) |
| 날짜를 일정 간격만큼 이동(여기서는 한 달 전) | CALCULATE ( [Total Sales], DATEADD ( 'Date'[Date], -1, MONTH ) ) |
| 전월 전체 | CALCULATE ( [Total Sales], PREVIOUSMONTH ( 'Date'[Date] ) ) |
| 1년 전의 기간 전체 | CALCULATE ( [Total Sales], PARALLELPERIOD ( 'Date'[Date], -1, YEAR ) ) |
| 마지막으로 보이는 날짜까지 최근 12개월 | CALCULATE ( [Total Sales], DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -12, MONTH ) ) |
| 고정된 날짜 범위 | CALCULATE ( [Total Sales], DATESBETWEEN ( 'Date'[Date], DATE ( 2025, 1, 1 ), DATE ( 2025, 3, 31 ) ) ) |
자주 쓰는 측정값 패턴
복사한 다음 테이블과 열 이름을 여러분의 모델에 맞게 바꾸세요.
| 용도 | DAX |
|---|---|
| 전체 범주 대비 비율 | Category % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) ) |
| 슬라이서로 남은 범위 대비 비율 | Visible % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) ) |
| 전년 대비 성장률 | YoY % = VAR LastYear = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN DIVIDE ( [Total Sales] - LastYear, LastYear ) |
| 전체 기간 누계 | Running Total = CALCULATE ( [Total Sales], FILTER ( ALL ( 'Date'[Date] ), 'Date'[Date] <= MAX ( 'Date'[Date] ) ) ) |
| 7일 이동 평균(매출이 있는 날 기준) | Sales 7 Day Avg = AVERAGEX ( DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -7, DAY ), [Total Sales] ) |
| 상위 5개에만 값 표시 | Top 5 Sales = IF ( RANKX ( ALLSELECTED ( Product[Product] ), [Total Sales] ) <= 5, [Total Sales] ) |
| 기준을 넘는 고객 수 세기 | Big Customers = COUNTROWS ( FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) ) |
| 합계가 행 값의 합과 맞도록 만들기 | Bonus Total = SUMX ( VALUES ( Product[Category] ), [Bonus] ) |
| 행렬의 한 수준에서만 값 표시 | Category Rank = IF ( ISINSCOPE ( Product[Category] ), RANKX ( ALL ( Product[Category] ), [Total Sales] ) ) |
| 기말 잔액: 값이 있는 마지막 날짜 | Closing Units = CALCULATE ( SUM ( Inventory[Units] ), LASTNONBLANK ( 'Date'[Date], CALCULATE ( SUM ( Inventory[Units] ) ) ) ) |
논리 함수와 정보 함수
조건을 다루고, 필터 컨텍스트에 무엇이 남아 있는지 확인할 때 씁니다.
| 용도 | DAX |
|---|---|
| 조건 하나 | IF ( [Total Sales] > 1000, "High", "Low" ) |
| 식 하나가 가지는 여러 값 | SWITCH ( Store[Country], "Spain", "ES", "Portugal", "PT", "Other" ) |
| 범위를 위에서 아래로 검사 | SWITCH ( TRUE (), [Total Sales] >= 10000, "A", [Total Sales] >= 1000, "B", "C" ) |
| AND와 OR | IF ( Sales[Quantity] > 2 && Sales[Amount] > 50, "Big", "Small" ) |
| 값이 공백인가? | ISBLANK ( [Total Sales] ) |
| 공백이 아닌 첫 번째 값 | COALESCE ( [Total Sales], 0 ) |
| 필터 결과 값이 정확히 하나만 남는가? | HASONEVALUE ( Product[Category] ) |
| 그 값 하나, 없으면 기본값 | SELECTEDVALUE ( Product[Category], "All categories" ) |
| 시각적 개체의 이 행이 해당 열로 그룹화되었는가? | ISINSCOPE ( Product[Category] ) |
| 공백 반환 | BLANK () |
텍스트 함수
& 연산자는 텍스트를 잇고, FORMAT은 숫자나 날짜를 텍스트로 바꿉니다.
| 용도 | DAX |
|---|---|
| 텍스트 잇기 | Customer[First Name] & " " & Customer[Last Name] |
| 숫자 서식 지정 | FORMAT ( [Total Sales], "#,0.00" ) |
| 날짜 서식 지정 | FORMAT ( 'Date'[Date], "mmm yyyy" ) |
| 앞쪽 문자 | LEFT ( Product[Code], 3 ) |
| 특정 위치부터의 문자 | MID ( Product[Code], 4, 2 ) |
| 길이 | LEN ( Product[Name] ) |
| 대문자로 바꾸기 | UPPER ( Store[City] ) |
| 불필요한 공백 제거 | TRIM ( Customer[Name] ) |
| 텍스트 바꾸기 | SUBSTITUTE ( Customer[Phone], " ", "" ) |
| 대소문자 구분 없이 텍스트 위치 찾기(없으면 0) | SEARCH ( "pro", Product[Name], 1, 0 ) |
날짜 함수
날짜는 내부적으로 숫자이므로, 빼면 일수가 나옵니다.
| 용도 | DAX |
|---|---|
| 오늘 날짜 | TODAY () |
| 날짜 만들기 | DATE ( 2025, 12, 31 ) |
| 날짜의 연도 | YEAR ( 'Date'[Date] ) |
| 월 번호 | MONTH ( 'Date'[Date] ) |
| 요일(월요일이 1) | WEEKDAY ( 'Date'[Date], 2 ) |
| 주 번호(월요일에 시작하는 주) | WEEKNUM ( 'Date'[Date], 2 ) |
| 월의 마지막 날 | EOMONTH ( 'Date'[Date], 0 ) |
| 한 달 전 같은 날 | EDATE ( 'Date'[Date], -1 ) |
| 두 날짜 사이의 일수 | DATEDIFF ( Sales[Order Date], Sales[Ship Date], DAY ) |
| 고정 날짜로 날짜 테이블 만들기 | CALENDAR ( DATE ( 2024, 1, 1 ), DATE ( 2025, 12, 31 ) ) |
| 모델에 있는 날짜로 날짜 테이블 만들기 | CALENDARAUTO () |
관계와 조회
RELATED는 관계를 따라 다 쪽에서 일 쪽으로 이동합니다.
| 용도 | DAX |
|---|---|
| 일 쪽의 값(Sales의 열에서) | RELATED ( Product[Category] ) |
| 현재 행에 대응하는 다 쪽의 행(Customer의 열에서) | COUNTROWS ( RELATEDTABLE ( Sales ) ) |
| 관계 없이 값 조회 | LOOKUPVALUE ( Product[Price], Product[SKU], Sales[SKU] ) |
| 부모 자식 경로(계층 구조와 행 수준 보안용) | PATH ( Employee[Employee ID], Employee[Manager ID] ) |
| 로그인한 사용자(동적 행 수준 보안용) | USERPRINCIPALNAME () |
테이블 함수
테이블을 반환하는 함수입니다. 계산 테이블, CALCULATE 안, 반복기에서 사용하세요.
| 용도 | DAX |
|---|---|
| 현재 필터의 고유 값 | VALUES ( Product[Category] ) |
| 조건을 통과한 행 | FILTER ( Product, Product[Price] > 100 ) |
| 측정값 기준 상위 N개 행 | TOPN ( 5, ALL ( Product[Product] ), [Total Sales] ) |
| 열로 그룹화하고 측정값 추가 | SUMMARIZECOLUMNS ( Product[Category], "Sales", [Total Sales] ) |
| 테이블에 열 추가 | ADDCOLUMNS ( VALUES ( Product[Category] ), "Sales", [Total Sales] ) |
| 열을 골라 이름 바꾸기 | SELECTCOLUMNS ( Customer, "Name", Customer[Name], "City", Customer[City] ) |
| 숫자 목록 | GENERATESERIES ( 1, 10, 1 ) |
| 두 테이블의 모든 조합 | CROSSJOIN ( VALUES ( 'Date'[Year] ), VALUES ( Product[Category] ) ) |
| 열이 같은 두 테이블을 위아래로 쌓기 | UNION ( 'Sales 2024', 'Sales 2025' ) |
변수
VAR는 단계에 이름을 붙여 한 번만 계산하고, RETURN이 결과를 돌려줍니다.
| 용도 | DAX |
|---|---|
| 변수 하나 | Margin % = VAR Revenue = [Total Sales] RETURN DIVIDE ( Revenue - [Total Cost], Revenue ) |
| 변수 여러 개 | Sales vs LY = VAR CY = [Total Sales] VAR PY = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN CY - PY |
| 변수에 테이블 담기 | Top 5 Total = VAR Top5 = TOPN ( 5, ALL ( Product[Product] ), [Total Sales] ) RETURN CALCULATE ( [Total Sales], Top5 ) |
Power Query(M) 단계
Power Query는 데이터를 불러오기 전에 정리합니다. 자주 쓰는 버튼 뒤에서 실행되는 M 수식입니다.
| 용도 | M |
|---|---|
| 조건에 맞는 행 유지 | Table.SelectRows(Source, each [Status] = "Paid") |
| 열 제거 | Table.RemoveColumns(Source, {"Notes", "Temp"}) |
| 열 형식 지정 | Table.TransformColumnTypes(Source, {{"Amount", type number}, {"Date", type date}}) |
| 열 이름 바꾸기 | Table.RenameColumns(Source, {{"amt", "Amount"}}) |
| 열 추가 | Table.AddColumn(Source, "Total", each [Quantity] * [Price], type number) |
| 두 쿼리 병합(조인) | Table.NestedJoin(Sales, {"ProductID"}, Products, {"ProductID"}, "Product", JoinKind.LeftOuter) |
| 쿼리 추가(위아래로 쌓기) | Table.Combine({Sales2024, Sales2025}) |
| 열 피벗 해제해 행으로 만들기 | Table.UnpivotOtherColumns(Source, {"Product"}, "Month", "Amount") |
| 그룹화하고 집계 | Table.Group(Source, {"Category"}, {{"Sales", each List.Sum([Amount]), type number}}) |
| 오류를 값으로 바꾸기 | Table.ReplaceErrorValues(Source, {{"Amount", 0}}) |
이 Power BI 치트시트는 가장 자주 쓰는 DAX를 한 페이지에 모았습니다. 집계, X 반복기, CALCULATE와 필터를 바꾸는 함수, 시간 인텔리전스, 텍스트 함수와 날짜 함수, 그리고 전체 대비 비율, 전년 대비 성장률, 누계처럼 그대로 복사해 쓸 수 있는 측정값 패턴을 담았습니다.
예제는 Sales, Product, Customer, 'Date' 테이블이 있는 매출 모델을 사용합니다. 이름은 여러분의 모델에 맞게 바꾸세요. 여기 있는 DAX는 모두 Coddy Power BI 코스의 엔진으로 구문을 확인했습니다. 코스에서는 브라우저 속 Power BI 작업 영역에서 DAX를 작성하고 검사받을 수 있습니다.
Power BI 치트시트 자주 묻는 질문
이 Power BI 치트시트는 무료인가요?
네. 여기서 읽거나 즐겨찾기에 추가하세요. 가입은 필요 없습니다.
측정값과 계산 열의 차이는 무엇인가요?
계산 열은 새로 고칠 때 행마다 한 번 계산되어 저장되므로, 그 열로 데이터를 나눠 볼 수 있습니다. 측정값은 시각적 개체의 셀마다 그 셀의 필터로 계산되며 아무것도 저장하지 않습니다. 합계와 비율은 측정값으로 만드세요.
CALCULATE는 무엇을 하나요?
필터를 바꿔서 식을 계산합니다. 필터를 추가하거나 대체하거나 제거한 다음 결과를 계산합니다. 단순한 합계를 넘어서는 DAX는 대부분 알맞은 필터 인수를 준 CALCULATE입니다.
왜 / 연산자 대신 DIVIDE를 쓰나요?
DIVIDE는 분모가 0이거나 공백이면 공백(또는 지정한 값)을 반환합니다. / 연산자는 대신 무한대나 오류 값을 반환하고, 이 값이 시각적 개체에 그대로 나타납니다.시간 인텔리전스에 날짜 테이블이 필요한가요?
TOTALYTD, SAMEPERIODLASTYEAR 같은 함수에는 하루에 한 행씩 빠진 날 없이 연 단위로 채워진 테이블이 필요합니다. 이 테이블을 팩트 테이블과 관계로 연결하고 날짜 테이블로 표시하세요.이 DAX는 Excel Power Pivot과 Analysis Services에서도 작동하나요?
DAX 언어는 공통이라 거의 모두 그대로 작동합니다. 몇몇 새 함수는 Power BI에 먼저 추가됩니다.
DAX는 어디서 연습할 수 있나요?
Coddy의 Power BI 코스에서 연습할 수 있습니다. 레슨마다 브라우저에서 Power BI 작업 영역이 열리고, 작성한 측정값을 레슨 데이터와 그 숨겨진 사본으로 검사합니다.