---
# System prepended metadata

title: Complete Usecase (semi additive)
tags: [dax-foundation-course]

---

---
title: Complete Usecase (semi additive)
tags: dax-foundation-course
---
:::info
DAX materials for Analyzing Data in Power BI course.

[datapot.vn](datapot.vn), 2022.

:::

**Download practice file**: [LINK DOWNLOAD - Need Login with Datapot account]

# Semi-additive Calculations

**Case study**: Tính tổng giá trị tài khoản của các Khách hàng tại ngày đầu tiên/cuối cùng của một kì báo cáo.

Lưu ý, kì báo cáo có thể là tháng, quý, năm.

**Mô hình đơn giản của case study**:

![](https://hackmd.io/_uploads/ByE3GU7zc.png)


**Giải thích**: Trong bảng `Balances`, mỗi dòng dữ liệu tương ứng với giá trị tài khoản của mỗi khách hàng tại một ngày nhất định.

Task: Hãy tạo một bảng Matrix với Power BI để hiểu về cấu trúc của bảng `Balances`.

![](https://hackmd.io/_uploads/BkC2XL7G5.png)

Từ bảng dữ liệu trên, chúng ta cần cân nhắc một số vấn đề như sau:

1. What is the end balance of Katie Jordan’s account for 2020? Her last available balance is on September 30, so should we consider this to be the final value for 2020? Similarly, is the balance of Luis Bonifaz’s account zero or is it 1,813.00 at the end of 2020?
2. What is the total end balance over all three customers for 2020? Is it only the amount on Maurizio Macagno’s account – because his balance is the last one – or is it the sum of the last balance for each customer, at their respective dates?
3. What is the starting balance of 2020 for Luis Bonifaz? Is it the balance on January 1, 2020 or December 27/31, 2019?

**Nhận xét:** Cần xác định ngày chốt dữ liệu cho các kì báo cáo và logic tính toán tổng giá trị tài khoản của KH tại ngày cuối cùng đó như thế nào?

## Task 1: Calculate end of period balance

### Option 1: First and Last Date

```python=
Balance LastDate =
CALCULATE (
    SUM ( Balances[Balance] ),
    LASTDATE ( 'Date'[Date] )   
)

-- Note: Use FIRSTDATE for Balance FirstDate
```

### Option 2: First and Last Date with data

```python=
Balance LastDateWithData = 
VAR MaxBalanceDate =
    CALCULATE (
        MAX ( Balances[Date] ),   -- Use MIN for Balance FirstDateWithData
        ALLEXCEPT (
            Balances,             -- Remove filters from the Balances expanded table
            'Date'                -- but not from the date
        )
    )
VAR Result =
    CALCULATE (
        SUM ( Balances[Balance] ),
        'Date'[Date] = MaxBalanceDate
    )
RETURN
    Result
```

### Option 3: First and Last date by customer

```python=
Balance LastDateByCustomer =
VAR MaxBalanceDates =
    ADDCOLUMNS (
        SUMMARIZE (Balances, Customers[Name]),
        "@MaxBalanceDate", CALCULATE (MAX(Balances[Date]))
    )

VAR MaxBalanceDatesWithLineage =
    TREATAS (                  
        MaxBalanceDates,       
        Customers[Name],       
        'Date'[Date]
    )

VAR Result =
    CALCULATE (
        SUM ( Balances[Balance] ),
        MaxBalanceDatesWithLineage
    )
RETURN
    Result
```

```python=
Balance LastDateByCustomerEver =
VAR MaxDate =
    MAX ( 'Date'[Date] )
VAR MaxBalanceDates =
    CALCULATETABLE (
        ADDCOLUMNS (
            SUMMARIZE ( Balances, Customers[Name] ),
            "@MaxBalanceDate", CALCULATE ( MAX ( Balances[Date] ) )
        ),
        'Date'[Date] <= MaxDate
    )
VAR MaxBalanceDatesWithLineage =
    TREATAS ( MaxBalanceDates, Customers[Name], 'Date'[Date] )
VAR Result =
    CALCULATE ( SUM ( Balances[Balance] ), MaxBalanceDatesWithLineage )
RETURN
    Result
```

## Task 2: Calculate opening and closing balance

```python=
Opening =
VAR PreviousClosingDate =
    DATEADD ( FIRSTDATE ( 'Date'[Date] ), -1, DAY )
VAR Result =
    CALCULATE ( SUM ( Balances[Balance] ), PreviousClosingDate )
RETURN
    Result
```

```python=
Closing =
CALCULATE (
    SUM ( Balances[Balance] ),
    LASTDATE ( 'Date'[Date] )
)
```

```python=
Opening Ever =
VAR MinDate =
    MIN ( 'Date'[Date] )
VAR MaxBalanceDates =
    CALCULATETABLE (
        ADDCOLUMNS (
            SUMMARIZE ( Balances, Customers[Name] ),
            "@MaxBalanceDate", CALCULATE ( MAX ( Balances[Date] ) )
        ),
        'Date'[Date] < MinDate
    )
VAR MaxBalanceDatesWithLineage =
    TREATAS ( MaxBalanceDates, Customers[Name], 'Date'[Date] )
VAR Result =
    CALCULATE ( SUM ( Balances[Balance] ), MaxBalanceDatesWithLineage )
RETURN
    Result
```

```python=
Closing Ever =
VAR MaxDate =
    MAX ( 'Date'[Date] )
VAR MaxBalanceDates =
    CALCULATETABLE (
        ADDCOLUMNS (
            SUMMARIZE ( Balances, Customers[Name] ),
            "@MaxBalanceDate", CALCULATE ( MAX ( Balances[Date] ) )
        ),
        'Date'[Date] <= MaxDate
    )
VAR MaxBalanceDatesWithLineage =
    TREATAS ( MaxBalanceDates, Customers[Name], 'Date'[Date] )
VAR Result =
    CALCULATE ( SUM ( Balances[Balance] ), MaxBalanceDatesWithLineage )
RETURN
    Result
```

## Task 3: Calculate Growth in Period

```python=
Growth =
VAR Opening = [Opening]
VAR Closing = [Closing]
VAR Delta =
    IF (
        NOT ISBLANK ( Opening ) && NOT ISBLANK ( Closing ),
        Closing - Opening 
    )
VAR Result =
    IF ( Delta <> 0, Delta )
RETURN
    Result
```

```python=
Growth Ever =
VAR Opening = [Opening Ever]
VAR Closing = [Closing Ever]
VAR Delta =
    IF (
        NOT ISBLANK ( Opening ) && NOT ISBLANK ( Closing ),
        Closing - Opening 
    )
VAR Result =
    IF ( Delta <> 0, Delta )
RETURN
    Result
```