# 문자열 함수

**• CONCATENATE: 문자열 연결**

1. **함수 정의 :** 
1. CONCATENATE 함수는 **두 개의 문자열을 결합하는 데 사용**됩니다. 이 함수는 기본적으로 **두 개의 텍스트 값을 하나로 합쳐 하나의 문자열을 반환**합니다.

2. **기본 구분**
2. CONCATENATE(<문자열1>, <문자열2>)

3. **매개 변수**
3. <문자열1>: 첫 번째로 결합할 텍스트 값
3. <문자열2>: 두 번째로 결합할 텍스트 값

4. **예시 코드** :
4. **1. 단순 문자열 결합**
4. **CONCATENATE("Hello", "World")**
4. 이 함수는 **"HelloWorld"라는 결과를 반환**합니다. 여기서는 두 문자열 사이에 공백이 없기 때문에, 결과는 HelloWorld로 출력됩니다.
4. **2. 열의 값 결합**
4. 데이터 모델에서 두 열을 결합할 수 있습니다.
4. 예를 들어, 직원들의 성(first name)과 이름(last name)을 결합하여 전체 이름을 생성하려고 할 때, 다음과 같이 사용할 수 있습니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20241111/144321_RfBm1NsBuQZWlQ4CJD?q=80&s=1280x180&t=outside&f=webp)

     **CONCATENATE(Employees[First Name], Employees[Last Name])**
     결과는:

![Image](https://upload.cafenono.com/image/slashpagePost/20241111/144342_bgcXZxlh8HA8GggXWq?q=80&s=1280x180&t=outside&f=webp)

**     3.공백 추가**
     CONCATENATE 함수는 **문자열 사이에 공백을 자동으로 추가하지 않기 때문에**, 

     **공백을 포함하려면 수동으로 추가**해야 합니다.
     **CONCATENATE(Employees[First Name], " " & Employees[Last Name])**
     결과:

![Image](https://upload.cafenono.com/image/slashpagePost/20241111/144402_1EcLe5UyrQa57qt1Ri?q=80&s=1280x180&t=outside&f=webp)

     이처럼 CONCATENATE 함수는 **간단하게 두 텍스트를 연결하는 데 유용**하며, 

     열의 값을 결합하여 새로운 텍스트 필드를 만들 때 자주 사용됩니다.
     이 외에도 여러 문자열을 결합해야 할 경우에는 CONCATENATEX 함수도 사용할 수 있습니다.

•** CONCATENATEX: 식을 평가한 후 문자열 연결**

1. **함수 정의** : 
1. CONCATENATEX 함수는 **테이블이나 열의 여러 값을 결합할 때 사용하는 함수**입니다. 단순히 **두 개의 문자열을 결합하는 CONCATENATE 함수**와는 달리, **CONCATENATEX 함수는 테이블이나 열의 여러 행을 한 번에 결합**할 수 있고, 각각의 값 사이에 구분자(Delimiter)를 넣을 수 있습니다.

2. **기본 구문**: 
2. CONCATENATEX(<테이블>, <열 또는 표현식>, [구분자], [정렬 순서], [정렬 열])

3. **매개 변수**: 
3. <테이블>: 값을 결합할 테이블 또는 테이블을 반환하는 함수.
3. <열 또는 표현식>: 결합하려는 텍스트를 포함하는 열 또는 계산식.
3. [구분자]: (선택 사항) 각 값을 결합할 때 사이에 넣을 구분자(콤마, 공백 등). 기본값은 빈 문자열("").
3. [정렬 순서]: (선택 사항) 값들을 정렬할 기준(ASC: 오름차순, DESC: 내림차순).
3. [정렬 열]: (선택 사항) 정렬 기준이 될 열.

4. **예시 코드** :
4. (1) **단순한 문자열 결합**
4.  예를 들어, **직원들의 이름을 모두 결합하고, 각 이름을 쉼표로 구분**하고자 한다고 가정해봅시다.

![Image](https://upload.cafenono.com/image/slashpagePost/20241112/144321_JxcHQX9zbfSFM6c39K?q=80&s=1280x180&t=outside&f=webp)

      **CONCATENATEX(Employees, Employees[직원 이름], ", ")**
      **결과:
      "John, Jane, Bob"**
      직원 이름 **열에 있는 모든 이름을 쉼표와 공백(", ")으로 구분하여 하나의 문자열로 결합**합니다.
     (2) **구분자를 사용하여 열의 값 결합**
      이번에는 각 **직원의 직책을 결합**하는 예를 보겠습니다. 각 **직책은 슬래시(/)로 구분**합니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20241112/144339_kE3ezHbkbPIIuYDqml?q=80&s=1280x180&t=outside&f=webp)

      **CONCATENATEX(Employees, Employees[직책], " / ")
      결과:**
    **  "Manager / Developer / Analyst"**
      각 직원의 **직책이 슬래시로 구분되어 하나의 문자열로 결합**됩니다.
     (3) **정렬 순서를 추가한 경우**
      정렬 기준을 추가해서, **직원 이름을 오름차순으로 정렬하여 결합**해보겠습니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20241112/144403_LaplSYED0P7vr7gHxB?q=80&s=1280x180&t=outside&f=webp)

      C**ONCATENATEX(Employees, Employees[직원 이름], ", ", ASC)
      결과:
      "Bob, Jane, John"**
      이 경우, 이름을 **알파벳 순서대로 오름차순(ASC)으로 정렬한 후 결합**하여 반환합니다.
     (4) **숫자 데이터 결합**
      숫자 데이터를 결합할 수도 있습니다. 예를 들어, 판매량 데이터를 결합해봅시다.

![Image](https://upload.cafenono.com/image/slashpagePost/20241112/144421_S22mynJJwHnwTmRJ51?q=80&s=1280x180&t=outside&f=webp)

      **CONCATENATEX(Sales, Sales[판매량], ", ")
      결과:
      "10, 20, 30"**
      **숫자도 문자열처럼 쉼표로 구분되어 결합**됩니다.

1. **요약**
1. CONCATENATEX 함수는 **테이블의 여러 행을 결합할 때 매우 유용**합니다. 각 값을 구분자로 나눌 수 있고, 원하는 방식으로 정렬할 수 있기 때문에 데이터 시각화나 보고서에서 많은 데이터를 간결하게 표현할 때 자주 사용됩니다.

• **FIND: 텍스트 위치 찾기**

1. **함수 정의** :
1. FIND 함수는 주어진 텍스트 문자열에서 **특정 문자의 위치를 찾는 데 사용**됩니다. **텍스트 안에서 원하는 문자열이 처음으로 등장하는 위치를 반환**합니다. 기본적으로 **대소문자를 구분**하며, **원하는 문자가 발견되지 않으면 오류를 반환**합니다.

2. **기본 구문** :
2. FIND(찾을_문자열, 전체_문자열, [시작_위치])

3. **매개 변수** :
3. 찾을_문자열: 검색할 문자열
3. 전체_문자열: 검색 대상이 되는 전체 문자열
3. 시작_위치(선택 항목): 검색을 시작할 위치. 생략 시 기본값은 1(문자열의 첫 번째 문자).

4. **예시 코드** :
4. (1) **기본적인 사용 예시**
4. **=FIND("c", "DAX Functions", 1)**
4. 이 예시는 "DAX Functions"라는 문자열에서** "c"라는 문자가 처음 등장하는 위치**를 찾습니다. **결과는 8이 반환**됩니다. 즉, "c"는 8번째에 위치합니다.
4. (2) **대소문자 구분**
4. **= FIND("f", "DAX Functions", 1)**
4. 이 경우 **"f"는 "DAX Functions"에서 소문자로 존재하지 않기 때문에 오류를 반환**합니다. 
4. FIND 함수는 **대소문자를 구분하기 때문에 "F"와 "f"는 다르게 처리**됩니다.
4. (3) **시작 위치 지정**
4. **= FIND("n", "DAX Functions", 5)**
4. 이 함수는 5번째 문자부터 "n"을 찾습니다. **결과는 7**로, "DAX Functions"의 **5번째 문자는 "F**"이며, **그 이후에 첫번째로 나오는 **소문자 "n"**은 7번째에 위치**하고 있습니다.

5. 요약 :
5. 이처럼 FIND 함수는 **텍스트 내에서 특정 문자가 어디에 있는지 빠르게 찾아야** **할 때 유용**하게 사용될 수 있습니다.

• **FORMAT: 형식 지정**

1. **함수 정의** :
1. FORMAT 함수는 **숫자나 날짜 값을 특정한 형식의 텍스트로 변환**하는 데 사용됩니다. 주로 **숫자나 날짜 데이터를 특정 형식으로 변환해서 보기 좋게 표시**할 때 유용합니다.

2. **기본 구문** :
2. FORMAT(값, "형식")

3. **매개 변수** :
3. 값: 형식을 지정할 값 (숫자나 날짜).
3. 형식: 숫자나 날짜의 출력 형식(문자열).

4. **예시 코드** :
4. (1) **숫자 포맷**
4. 예를 들어, **숫자 1234.56을 통화 형식**으로 표시하고 싶다면:
4. **FORMAT(1234.56, "₩#,##0.00")**
4. 이 코드는** ₩1,234.56로 출력**됩니다.
4. "₩": 통화 기호.
4. #,##0.00: 천 단위 구분 기호와 소수점 이하 두 자리를 표시.
4. (2) **날짜 포맷**
4. **날짜를 특정 형식으로 변환**하고 싶다면:
4. **FORMAT(TODAY(), "YYYY-MM-DD")**
4. 이 코드는 **오늘의 날짜를 2024-10-17 형식으로 출력**합니다.
4. "YYYY": 4자리 연도로 표시.
4. "MM": 2자리 월 표시.
4. "DD": 2자리 일 표시.
4. (3) **사용자 정의 텍스트 형식**
4. **숫자를 백분율로 표시**할 때는:
4. **FORMAT(0.1234, "0.00%")**
4. 이 코드는 **12.34% 로 출력**됩니다.
4. 0.00%: 소수점 이하 두 자리를 표시하고 백분율 기호를 추가.

5. **요약** :
5. FORMAT 함수는 **숫자나 날짜를 사용자 정의 형식으로 변환하**는 함수입니다.
5. **숫자에 천 단위 구분, 소수점 자릿수, 통화 기호를 추가**하거나, **날짜를 다양한 형식으로 표시**할 때 유용합니다.
5. FORMAT 함수는 보고서나 대시보드에서 데이터를 더 가독성 있게 만들기 위해 자주 사용됩니다.

• **LEFT: 왼쪽에서 지정한 문자 수 반환**

1. **함수 정의** :
1. LEFT 함수는 **문자열의 왼쪽에서부터** **지정한 개수만큼의 문자를 추출**하는 함수입니다.

2. **기본 구분** :
2. LEFT(<text>, <num_chars>)

3. **매개 변수** :
3. <text>: 추출할 원본 문자열입니다.
3. <num_chars>: 왼쪽에서부터 추출할 문자 수입니다.

4. **예시 코드** :
4. (1) "Power BI"라는 문자열에서 **앞의 5글자만 추출**하고 싶다면, 다음과 같이 사용할 수 있습니다.
4. **LEFT("Power BI", 5)**
4. **결과:
4. Power**
4. (2) 테이블에 **ProductCode라는 열**이 있고 값이 "AB12345"라면, 이 코드의 **앞 두 글자만 추출**하고 싶을 때는
4. **LEFT([ProductCode], 2)**
4. **결과:
4. AB**

5. **요약** :
5. 이와 같이 LEFT 함수는 **문자열의 일부분만 필요**할 때 유용하게 사용됩니다.

• **LEN: 문자열 길이 반환**

1. **함수 정의** : 
1. LEN 함수는 **문자열(텍스트)의 길이를 반환하는 함수**입니다. 즉, 문자열 안에 있는 문자의 개수를 세어줍니다. **공백도 하나의 문자로 포함**됩니다.

2. **기본 구문** :
2. LEN(<문자열>)

3. **매개 변수** : 
3. <문자열>에는 길이를 구하고 싶은 텍스트가 들어갑니다.
3. 반환값은 해당 문자열의 문자 수입니다.

4. **예시 코드** :
4. (1) **기본 예시**
4. **LEN("Hello World")**
4. **결과: 11 (문자 11개: H, e, l, l, o, 공백, W, o, r, l, d)**
4. (2) **컬럼 데이터를 사용할 때**
4. 테이블에 ProductName이라는 컬럼이 있다고 가정할 때:
4. **LEN(Product[ProductName])**
4. 각 제품 이름의 길이를 반환합니다. 예를 들어, **ProductName에 "Apple"이라는 값이 있다면 결과는 5**가 됩니다.
4. (3) **응용 예시 **- **문자열의 길이를 기준으로 필터링하기**
4. 문자열 길이가 10 이상인 제품만 계산하고 싶은 경우:**CALCULATE( COUNTROWS(Product), LEN(Product[ProductName]) >= 10 )**
4. 이 예시는 **제품 이름의 길이가 10 이상인 제품의 개수를 계산**합니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20241112/160123_00awbVTXEl1RGrkv9v?q=80&s=1280x180&t=outside&f=webp)

**     CALCULATE( COUNTROWS(Product), LEN(Product[ProductName]) >= 10 )**
     이 예시는 **제품 이름의 길이가 10 이상인 제품의 개수를 계산**합니다.

![Image](https://upload.cafenono.com/image/slashpagePost/20241112/160232_fulPH0iBYZIQARJN2f?q=80&s=1280x180&t=outside&f=webp)

     **결과**
     **길이가 10자 이상인 제품은 Watermelon과 Orange Juice**입니다.
     조건에 맞는 제품은 2개이므로, 이 계산의 **최종 결과는 2**입니다.

1. **주의할 점** :
1. LEN 함수는 문자열 안의 **모든 문자를 그대로 센다는 점**을 기억해야 합니다. **공백, 특수 문자, 숫자 등 모든 문자를 포함**합니다.
1. **다국어 문자가 포함된 문자열의 경우에도 정상적으로 작동**합니다.

2. **요약** :
2. LEN 함수를 사용하면 **문자열의 길이를 구할 수 있어 문자열 길이 기반의 필터링, 계산 등에 유용**하게 활용할 수 있습니다.

•** LOWER: 소문자로 변환**

1. **함수 정의** :
1. LOWER 함수는 **텍스트 문자열을 모두 소문자로 변환하는 데 사용**됩니다. 이 함수는 텍스트 데이터를 표준화하거나 일관성 있게 표시하는 데 매우 유용합니다.

2. **기본 구문** :
2. LOWER(<text>)

3. **매개 변수** :
3. <text>: 소문자로 변환하고자 하는 텍스트 또는 텍스트가 포함된 열에 대한 참조입니다.

4. **주요 특징** :
4. • **모든 대문자를 소문자로 변환**합니다.
4. • **숫자나 특수 문자는 변경되지 않습니다**.
4. • **결과값은 소문자로 된 텍스트**입니다.

5. **예시 코드** :
5. **(1) 기본 예시**
5.  **LOWER("HELLO WORLD") **
5.  결과 : 
5.  **"hello world"를 반환**합니다.
5. **(2) 열 데이터 변환 **
5.  제품 코드가 포함된 'New Products' 테이블이 있다고 가정해 봅시다. 모든 제품 코드를 소문자로 변환하려면 다음과 같은 계산 열을 만들 수 있습니다
5.  **LowerCaseProductCode = LOWER('New Products'[ProductCode])`**
5.  이 공식은 **'ProductCode' 열의 각 값을 소문자로 변환**합니다.
5. **(3) 혼합 텍스트 처리**
5. ** = LOWER("123ABC")**
5.  결과 :
5.  **"123abc"를 반환**합니다. **숫자는 변경되지 않고 알파벳만 소문자로 변환**됩니다.

6. **활용 사례** :
6. • 데이터 정리: 사용자 입력 **데이터를 표준화**할 때 유용합니다.
6. • 검색 최적화: **대소문자 구분 없이 검색을 수행**할 때 사용할 수 있습니다.
6. • 데이터 비교: **대소문자 차이로 인한 불일치를 방지**할 수 있습니다.

7. **요약** :
7. LOWER 함수는 간단하지만 강력한 도구로, 데이터 분석 및 보고서 작성 시 **텍스트 데이터의 일관성을 유지**하는 데 큰 도움이 됩니다.

• **MID: 중간에서 텍스트 반환**

1. **함수 정의 **:
1. MID 함수는 텍스트 문자열에서 **지정된 위치부터 특정 길이만큼의 문자를 추출**하는 데 사용됩니다. 이 함수는 데이터 분석 시 텍스트 데이터를 조작하거나 특정 부분을 추출할 때 매우 유용합니다.

2. **기본 구문** :
2. MID(<문자열>, <시작 위치>, <추출할 문자 수>)

3. **매개 변수** :
3. <문자열>: 추출할 문자열을 지정합니다.
3. <시작 위치>: 추출을 **시작할 위치**를 지정합니다. 첫 번째 문자는 1부터 시작합니다.
3. <추출할 문자 수>: **추출할 문자의 개수**를 지정합니다.

4. **예시 코드** :
4. **(1) 기본 예시**
4.  **MID("abcde", 2, 3)**
4.  결과 :
4.  **"bcd"를 반환**합니다. "abcde" 문자열에서 두 번째 위치부터 시작하여 3개의 문자를 추출합니다.
4. **(2) 열 데이터 활용**
4.  **MID('Reseller'[ResellerName], 1, 5)**
4.  결과 : 
4.  **'Reseller' 테이블의 'ResellerName' 열에서 각 이름의 첫 5글자를 추출**합니다. 이는  **LEFT([ResellerName], 5) 와** **동일한 결과를 제공**합니다.
4. **(3) 주문 번호에서 날짜 추출**
4.  주문 번호가 "ORD20240101_001" 형식으로 되어 있다고 가정해 봅시다. 이 경우 날짜 부분을  추출하려면:
4.  **ID('Orders'[OrderNumber], 4, 8)**
4.  결과 : 
4.  **주문 번호에서 "20240101"과 같은 날짜 부분을 추출**합니다.
4. **(4) 제품 코드의 중간 부분 추출**
4.  제품 코드가 "A1234567" 형식이라면, 중간의 4자리를 추출하기 위해:
4.  **MID('Products'[ProductCode], 2, 4)**
4.  결과 : 
4. ** "1234"와 같은 중간 4자리를 추출**합니다.

5. **MID 함수 사용 시 주의사항** :
5. • 시작 위치: **시작 위치가 텍스트의 길이보다 크면 빈 문자열이 반환**됩니다.
5. • 유니코드 지원: DAX의 MID 함수는 유니코드를 사용하므로 **모든 문자의 길이가 동일하게 취급**됩니다. 이는 Microsoft Excel의 싱글바이트 및 더블바이트 문자 처리와는 다릅니다.
5. • 숫자 데이터: MID 함수를 **숫자 데이터**에 사용할 경우, 결과는 **텍스트 형식으로 반환**됩니다.

6. **요약** :
6. MID 함수는 텍스트 데이터 분석과 조작에 있어 강력한 도구입니다. 특히 **복잡한 형식의 데이터에서 특정 부분을 추출하거나, 데이터 정제 작업을 수행할 때 매우 유용**하게 활용될 수 있습니다.

• **REPLACE: 텍스트 일부 대체**

1. **함수 정의** :
1. REPLACE 함수는 **텍스트 문자열의 일부를 다른 텍스트로 대체하는 데 사용**됩니다. 이 함수는 문자열 조작에 매우 유용하며, 데이터 정제나 형식 변경 작업에 자주 활용됩니다.

2. **기본 구문** :
2. REPLACE(문자열, 시작 위치, 대체할 문자 수, 새로운 문자열)

3. **매개 변수** : 
3. 문자열: 원래의 텍스트 문자열입니다.
3. 시작 위치: 변경을 시작할 위치입니다. (1부터 시작)
3. 대체할 문자 수: 원래 문자열에서 대체할 문자 개수입니다.
3. 새로운 문자열: 원래 문자열의 일부를 대체할 새로운 문자열입니다.

4. **예시 구문** :
4. **(1) 제품 코드 변경**
4.  제품 코드의 처음 두 문자를 "OB"로 변경하는 경우:
4.  **= REPLACE('Products'[ProductCode], 1, 2, "OB")**
4.  결과 :
4.  이 예시에서 **'AB1234'라는 제품 코드가 있다면, 결과는 'OB1234'**가 됩니다.
4. **(2) 전화번호 형식 변경**
4.  전화번호의 중간 4자리를 별표로 가리는 경우:
4.  **= REPLACE('Customers'[PhoneNumber], 5, 4, "****")
4. ** 결과 : 
4.  이 예시에서 '**010-1234-5678'이라는 전화번호가 있다면, 결과는 '010-****-5678'**이 됩니다].
4. **(3) 날짜 형식 수정**
4.  날짜 문자열에서 월을 변경하는 경우:
4. ** = REPLACE("2024-08-18", 6, 2, "09")**
4.  결과 :
4. ** "2024-09-18"**이 됩니다.

5. **사용 시 주의사항** :
5. • 시작 위치: 시작 위치는 1부터 시작합니다. 텍스트의 첫 번째 문자가 1번 위치입니다.
5. • 대소문자 구분: **REPLACE 함수는 대소문자를 구분하지 않습니다.**
5. • 문자 삭제: **특정 문자를 삭제**하려면 새로운 문자열(new_text) 매개변수를 **빈 문자열("")로 설정**하면 됩니다.
5. • 유니코드 지원: DAX는 유니코드를 사용하므로 **모든 문자를 동일한 길이로 처리**합니다.

6. **요약** :
6. REPLACE 함수는 데이터 정제, 형식 변경, 민감한 정보 마스킹 등 다양한 상황에서 유용하게 사용될 수 있습니다. 다른 DAX 함수와 결합하여 더 복잡한 텍스트 조작 작업을 수행할 수도 있습니다.

• **RIGHT: 오른쪽에서 지정한 문자 수 반환**

1. **함수 정의** :
1. RIGHT 함수는 **문자열의 오른쪽에서부터 지정된 수의 문자를 추출**하는 데 사용되는 텍스트 함수입니다. 이 함수는 특히 코드나 ID의 마지막 부분을 추출할 때 유용합니다.

2. **기본 구문** :
2. RIGHT(<문자열>, <문자 개수>)

3. **매개 변수** :
3. 문자열: 문자열 값을 포함하는 열 또는 직접 입력한 문자열.
3. 문자 개수: 오른쪽 끝에서 가져올 문자 수.

4. **예시 코드** :
4. **(1) 제품 코드의 마지막 두 자리 추출**
4.  제품 코드가 **'PROD001', 'PROD002' 등의 형식으로 저장**된 'ProductCode' 열이 있다고 가정해 봅시다. 마지막 두 자리 숫자만 추출하려면 다음과 같이 사용할 수 있습니다:
4.  **LastTwoDigits = RIGHT('Products'[ProductCode], 2)**
4.  결과 :
4. ** '01', '02' 등의 결과를 반환**합니다.
4. **(2) 이메일 도메인 추출**
4.  이메일 주소에서 도메인 부분만 추출하고 싶다면, '@' 기호 이후의 모든 문자를 가져오는 방식으로 RIGHT 함수를 사용할 수 있습니다:
4.  **EmailDomain = RIGHT('Customers'[Email], LEN('Customers'[Email]) - FIND("@", 'Customers'[Email]))**
4.  결과 :
4.  **'example.com', 'gmail.com' 등의 결과를 반환**합니다.
4. **(3) 가변 길이 추출**
4.  **추출할 문자 수가 동적**으로 변할 수 있습니다. 예를 들어, 'MyCount' 열의 값에 따라 제품 코드에서 가변 자릿수를 추출하고 싶다면 다음과 같이 사용할 수 있습니다:

![Image](https://upload.cafenono.com/image/slashpagePost/20241115/145231_unsKfQDPqDn3vkGAxf?q=80&s=1280x180&t=outside&f=webp)

      **DynamicExtract = RIGHT('Products'[ProductCode], [MyCount])**
      결과 :
      PROD001 (MyCount: 2):
      추출 결과: **'01'**
      설명: 오른쪽에서 2개의 문자를 추출했습니다.
      PROD002 (MyCount: 3):
      추출 결과:** '002'**
      설명: 오른쪽에서 3개의 문자를 추출했습니다.
      ITEMX123 (MyCount: 4):
      추출 결과: **'X123'**
      설명: 오른쪽에서 4개의 문자를 추출했습니다.
      ABC4567 (MyCount: 3):
      추출 결과: **'567'**
      설명: 오른쪽에서 3개의 문자를 추출했습니다.
      **'ProductCode' 열에서 'MyCount' 열에 지정된 수만큼의 문자를 오른쪽에서부터 추출**합니다.

      이러한 방식으로 가변 길이의 문자열을 동적으로 추출할 수 있어, 

      데이터 분석과 보고서 작성 시 유연성을 제공합니다.

1. **요약** :
1. RIGHT 함수는 **문자열 처리에 매우 유용**하며, 다른 DAX 함수들과 결합하여 더 복잡한 텍스트 조작 작업을 수행할 수 있습니다.

• **SEARCH: 텍스트 찾기**

1. **함수 정의** :
1. SEARCH 함수는 **텍스트 문자열 내에서 특정 단어나 문자가 위치하는 시작 위치를 반환**하는 함수입니다. 엑셀의 SEARCH 함수와 비슷하며, 주로 조건문에서 특정 텍스트를 포함하는지 확인할 때 사용됩니다.

2. **기본 구문** :
2. SEARCH(<찾을_텍스트>, <대상_텍스트>, [시작_위치], [찾지_못했을_때_값])매개 변수

3. **매개 변수** 
3. 찾을_텍스트: 검색할 단어나 문자입니다.
3. 대상_텍스트: 찾을 텍스트가 있는 텍스트 문자열입니다.
3. 시작_위치: 검색을 시작할 위치로, 기본값은 1입니다. (선택사항)
3. 찾지_못했을_때_값: 검색한 텍스트를 찾지 못했을 때 반환할 값을 지정할 수 있습니다. (선택사항)

4. **함수의 특징**
4. **대소문자를 구분하지 않습니다.**
4. **와일드카드 문자(* 및 ?)를 사용할 수 있습니다**.
4. **검색에 실패하면 오류를 반환**합니다 (찾지_못했을_때_반환값을 지정하지 않은 경우).

5. **예시 코드** :
5. **(1) 기본 사용법**
5.  **SEARCH("excel", "Microsoft Excel")**
5.  결과:** 11**
5.  이 예시는 "Microsoft Excel" 문자열에서 "excel"의 시작 위치를 찾습니다. "excel"은 11번째 위치에서 시작하므로 11을 반환합니다.
5. **(2) 대소문자 구분 없음**
5.  **SEARCH("EXCEL", "Microsoft Excel")**  
5.  결과: **11** SEARCH 함수는 **대소문자를 구분하지 않으므로, 위의 예시와 동일한 결과를 반환**합니다.
5. **(3) 시작 위치 지정**
5. ** SEARCH("a", "banana", 3)**
5.  결과:** 4**
5.  이 예시는 "banana" 문자열에서 "a"를 찾되, 3번째 위치부터 검색을 시작합니다. 따라서 4번째 위치에 있는 "a"를 찾아 4를 반환합니다.
5. **(4) 찾지 못했을 때 반환값 지정**
5.  **SEARCH("z", "banana", 1, "Not Found")**
5.  결과:** "Not Found"**
5.  이 예시에서는 "banana"에 "z"가 없으므로, 지정된 "Not Found" 값을 반환합니다.
5. **(5) 계산 열에서의 활용**
5.  'Product' 테이블에 다음과 같은 'ProductName' 데이터가 있다고 가정해 보겠습니다:
5.  "Mountain Bike Pro"
5.  "Road Bike Elite"
5.  "City Bicycle Commuter"
5.  "Sport Helmet Deluxe"
5.  구문:
5.  **BikePosition = SEARCH("bike", 'Product'[ProductName], 1, BLANK())**

      결과:

![Image](https://upload.cafenono.com/image/slashpagePost/20241115/152655_9f3V85uvhGBRfFSYax?q=80&s=1280x180&t=outside&f=webp)

      설명:
      "Mountain Bike Pro": "bike"가 10번째 위치에서 시작하므로 10을 반환합니다.
      "Road Bike Elite": "bike"가 6번째 위치에서 시작하므로 **6을 반환**합니다.
      "City Bicycle Commuter": **"bike"가 아닌 "bicycle"이 포함**되어 있으므로 **BLANK()를 반환**합니다.
      "Sport Helmet Deluxe": **"bike"가 포함되어 있지 않으므로 BLANK()를 반환**합니다.
    ** (6) 측정값에서의 활용**
      특정 문자열을 포함하는 제품의 판매량을 계산하는 측정값 예시:

![Image](https://upload.cafenono.com/image/slashpagePost/20241115/152721_YLVDgGPktQQEMGCx6w?q=80&s=1280x180&t=outside&f=webp)

     ** BikeSales = 
      CALCULATE(
          SUM(Sales[SalesAmount]),
          SEARCH("bike", 'Product'[ProductName], 1) > 0
      )
      결과 : 650 **
      설명 :
      "Mountain Bike Pro": "bike" 포함 (위치 10) - 계산에 포함
      "Road Bike Elite": "bike" 포함 (위치 6) - 계산에 포함
      "City Bicycle Commuter": "bike" 미포함 - 계산에서 제외
      "Sport Helmet Deluxe": "bike" 미포함 - 계산에서 제외
      따라서, BikeSales 측정값은 다음과 같이 계산됩니다:
      **Mountain Bike Pro 판매액: 300 + 150 = 450
      Road Bike Elite 판매액: 200
      총 BikeSales = 450 + 200 = 650**
      이 측정값을 사용하면, "bike"라는 단어가 포함된 제품들의 총 판매액을 쉽게 계산할 수 있습니다.

      이는 자전거 관련 제품의 성과를 빠르게 파악하는 데 유용할 수 있습니다.

1. **요약** :
1. SEARCH 함수는 이처럼 문자열 검색, 데이터 필터링, 조건부 계산 등 다양한 상황에서 유용하게 사용될 수 있습니다. 특히 **대소문자를 구분하지 않고 검색해야 하는 경우에 적합하며, 와일드카드 문자를 지원하여 더욱 유연한 검색이 가능**합니다.

**(참고)FIND 함수와 SEARCH 함수의 차이점**

1. **대소문자 구분 여부**
1. •**FIND: 대소문자를 구분**합니다.
1. 예: "Apple"과 "apple"은 다른 문자열로 취급됩니다.
1. •**SEARCH: 대소문자를 구분하지 않습니다**.
1. 예: "Apple"과 "apple"을 동일하게 취급합니다.

2. **와일드카드 지원 여부**
2. •**FIND: 와일드카드를 지원하지 않습니다**.
2. 예: "p*"와 같은 패턴은 검색할 수 없습니다.
2. •**SEARCH: 와일드카드를 지원**합니다.
2. 예: "p*"는 "pineapple"과 일치하며 첫 번째 위치를 반환합니다.

3. **찾을 수 없는 경우 처리**
3. •FIND: not_found_value를 사용하여 값 지정이 가능합니다.
3. 예: FIND("pear", "apple", , -1) → 결과: -1
3. •SEARCH: not_found_value를 사용하여 값 지정이 가능합니다.
3. 예: SEARCH("pear", "apple", , -1) → 결과: -1

4. **기본 용도**
4. •**FIND: 대소문자를 구분하여 문자열을 정확히 찾고 싶을 때 적합**합니다.
4. 예: 특정 단어나 패턴이 정확히 일치하는지 확인.
4. •**SEARCH: 대소문자를 구분하지 않고 유연한 검색(와일드카드 포함)이 필요할 때 적합**합니다.
4. 예: 텍스트 패턴 검색 또는 대소문자 무시 검색.

5. **검색 시작 위치**
5. •FIND: 검색 시작 위치를 지정할 수 있습니다.
5. 예: FIND("p", "pineapple", 6) → 결과: 8
5. •SEARCH: 검색 시작 위치를 지정할 수 있습니다.
5. 예: SEARCH("p", "pineapple", 6) → 결과: 8

• **SUBSTITUTE: 텍스트 대체**

1. **함수 정의** :
1. SUBSTITUTE 함수는 **문자열 내의 특정 텍스트를 다른 텍스트로 대체할 때 사용**합니다. 

2. **기본 구문** :
2. SUBSTITUTE(<텍스트>, <기존 텍스트>, <새 텍스트>[, < 인스턴스 번호 지정>])

3. **매개 변수** :
3. <텍스트>: 수정할 원본 텍스트입니다.
3. <기존 텍스트>: 대체하고 싶은 텍스트입니다.
3. <새 텍스트>: 대체할 새로운 텍스트입니다.
3. < 인스턴스 번호 지정> (선택): 문자열에서 **대체할 텍스트의 위치를 지정**합니다. 1이면 첫 번째로 나타나는 기존 텍스트만 바꾸고, 2면 두 번째 것을 바꾸는 방식입니다. **지정하지 않으면 모든 인스턴스를 대체**합니다.

4. **예시 코드** :
4. (1) Power BI is great"라는 문자열에서 "great"을 "amazing"으로 바꾸고 싶다면
4. **SUBSTITUTE("Power BI is great", "great", "amazing")**
4. 결과: 
4. **“"Power BI is amazing"를 반환**합니다.
4. (2) 특정 **인스턴스만 바꾸고 싶을 때**는 네 번째 인수를 사용하면 됩니다. 예를 들어, "apple, apple, apple"에서 두 번째 "apple"만 "orange"로 바꾸고 싶다면
4. **SUBSTITUTE("apple, apple, apple", "apple", "orange", 2)**
4. 결과:
4. **"apple, orange, apple"**가 됩니다.

5. **요약** :
5. 이렇게 SUBSTITUTE 함수는 **문자열 내에서 특정 단어나 구를 원하는 방식으로 쉽게 바꿀 수 있게** 해줍니다.

•** TRIM: 공백 제거**

1. **함수 정의** :
1. TRIM 함수는 **문자열의 앞, 뒤, 또는 중간에 있는 불필요한 공백을 제거하는 함수**입니다. 주로 **데이터 정리나 형식을 일관되게 하기 위해 사용**됩니다. TRIM 함수는 **모든 추가적인 공백을 제거**하고, **각 단어 사이의 하나의 공백만 남겨**둡니다.

2. **기본 구문** :
2. TRIM(<텍스트>)

3. **매개 변수** :
3. <텍스트>: 공백을 제거할 문자열입니다.

4. **예시 코드** :
4. 아래와 같은 데이터가 있다고 가정해봅시다.

![Image](https://upload.cafenono.com/image/slashpagePost/20241115/162025_i09RFX1rrbFx8RahEQ?q=80&s=1280x180&t=outside&f=webp)

     위 데이터에 TRIM 함수를 적용하면:
     **CleanProductName = TRIM(ProductName)**
     결과:

![Image](https://upload.cafenono.com/image/slashpagePost/20241115/162043_TreiZCXTCisB9orzec?q=80&s=1280x180&t=outside&f=webp)

1. **요약** :
1. 이렇게 TRIM 함수를 사용하면 **문자열의 앞뒤와 중간에 있는 불필요한 공백이 제거되어 데이터를 깔끔하게 정리**할 수 있습니다.

• **UPPER: 대문자로 변환**

1. **함수 정의** : 
1. UPPER 함수는 **문자열을 모두 대문자로 변환하는 함수**입니다. Excel의 UPPER 함수와 동일하게 작동합니다. 주로 텍스트 데이터의 형식을 통일하거나 대소문자 구분 없이 검색해야 할 때 유용하게 사용할 수 있습니다.

2. **기본 구문** : 
2. UPPER(<text>)

3. **매개 변수**:
3. <text>: 대문자로 변환할 문자열입니다. 이 값은 문자열이거나 문자열을 반환하는 열이 될 수 있습니다.

4. **예시 코드** :
4. **(1) 단순 문자열 변환**
4. ** UPPER("hello world")**
4.  결과: 
4.  **"HELLO WORLD"**
4. **(2) 열의 값을 대문자로 변환** 
4.  만약 Customers 테이블에 FirstName이라는 열이 있다고 가정하면:
4.  **UPPER(Customers[FirstName])**
4.  결과:
4. ** FirstName 값이 "John"이라면 결과는 "JOHN"**이 됩니다.
4. **(3) 대문자 변환을 사용한 새로운 열 생성**
4.  Customers 테이블에 아래와 같은 데이터가 있다고 가정해 보겠습니다:

![Image](https://upload.cafenono.com/image/slashpagePost/20241115/163048_K9CRh7oImM8Y6SMTwo?q=80&s=1280x180&t=outside&f=webp)

      여기서 City 열의 값을 대문자로 변환한 새로운 열 City_Upper를 추가하려고 할 때, 

      DAX 수식은 다음과 같이 작성할 수 있습니다:
      **City_Upper = UPPER(Customers[City])**
      결과 :

![Image](https://upload.cafenono.com/image/slashpagePost/20241115/163103_roMtRvWpGIQhix9fYS?q=80&s=1280x180&t=outside&f=webp)

      **City_Upper 열이 추가되면서, 기존의 City 열 값들이 모두 대문자로 변환**된 것을 볼 수 있습니다.

1. **요약** :
1. 이렇게 UPPER 함수를 사용하면 **데이터의 일관성을 유지**하면서, **텍스트 데이터를 처리**할 수 있습니다.

• **VALUE: 문자열을 숫자로 변환**

1. **함수 정의** :
1. VALUE 함수는 **텍스트 형식의 숫자 데이터를 실제 숫자 데이터로 변환할 때 사용**됩니다. 주로 **데이터 모델에서 숫자 값이 문자열로 저장되어 있을 때, 계산을 수행하거나 다른 숫자 값과 비교할 수 있도록 숫자 형식으로 변환할 때 유용**합니다.

2. **기본 구문** :
2. VALUE(<text>)

3. **매개 변수** : 
3. <text>: 숫자로 변환할 수 있는 텍스트 값입니다.

4. **동작 방식** :
4. • 입력된 **텍스트가 숫자로 변환 가능한 경우, 해당 숫자 값으로 반환**합니다.
4. • **텍스트가 숫자로 변환할 수 없는 경우, 오류를 반환**합니다.

5. **예시 코드** :
5. **(1) 간단한 사용 **
5.  **텍스트 "123"을 숫자 123으로 변환**하는 경우:
5.  **VALUE("123") **
5.  결과: **123**
5. **(2) 데이터 컬럼에서 변환**
5.  ProductSales라는 테이블이 있고, 이 테이블에는 Price 열이 텍스트 형식으로 저장되어 있다고 가정해보겠습니다. 데이터는 다음과 같습니다

![Image](https://upload.cafenono.com/image/slashpagePost/20241115/163751_LTG07lU28EzHAdcJTJ?q=80&s=1280x180&t=outside&f=webp)

      **Price 열의 텍스트 데이터를 숫자로 변환**하려면, 아래와 같이 DAX 계산 열을 만들 수 있습니다:
      **ConvertedPrice = VALUE(ProductSales[Price])**
      결과 :

![Image](https://upload.cafenono.com/image/slashpagePost/20241115/164113_ELtygNQn0gICFcBtIM?q=80&s=1280x180&t=outside&f=webp)

      **Price 열은 여전히 텍스트 형식**이지만, 

      **ConvertedPrice 열은 VALUE 함수를 통해 숫자 형식으로 변환**된 값입니다.
      이렇게 하면 ConvertedPrice 열에서 숫자 연산을 자유롭게 수행할 수 있습니다 

      (예: 합계, 평균, 비교 등).
     **(3) 숫자로 변환할 수 없는 텍스트** 
      **VALUE("Hello")**
      결과: 
      **오류** (텍스트 "Hello"는 숫자로 변환할 수 없기 때문)

1. **요약** :
1. VALUE 함수는 주로** CSV 파일이나 다른 외부 데이터 소스에서 가져온 값들이 텍스트로 저장되어 있을 때 유용하게 사용**됩니다. 이를 통해 계산을 더 쉽게 할 수 있도록 숫자로 변환할 수 있습니다.

For the site tree, see the [root Markdown](https://slashpage.com/powerbicokr.md).
