Menu
CoddyTech

Power BI 치트시트

마지막 업데이트

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" )
두 열에 걸친 ORCALCULATE ( [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와 ORIF ( 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 작업 영역이 열리고, 작성한 측정값을 레슨 데이터와 그 숨겨진 사본으로 검사합니다.

Coddy 프로그래밍 언어 일러스트

Coddy로 Power BI 배우기

시작하기