> For the complete documentation index, see [llms.txt](https://knowins.gitbook.io/tai-lieu-huong-dan-knowins-phan-1/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://knowins.gitbook.io/tai-lieu-huong-dan-knowins-phan-1/huong-dan/nhung-nhu-lieu.md).

# Nhúng Nhu Liệu

Trong phần này, chúng ta sẽ tiếp tục vẽ biểu đồ thu nhập của cộng tác viên theo từng khoảng thời gian. Cụ thể chúng ta muốn biết thu nhập của 3 ngày trước, tuần trước, tháng trước, quí trước và năm trước.

Rõ ràng dữ liệu cần thiết để vẽ đồ thị này không thể lấy được từ bộ nhu liệu bên dưới báo cáo, mà đang lấy tổng số tiền theo từng chương trình. Bạn cần số liệu giao dịch theo ngày. Nếu bạn kéo thêm cột ngày vào lưới kết xuất, thì tổng số tiền sẽ được tính toán theo tổ hợp giữa chương trình và ngày. Và khi có nhiều hơn một quyên góp xảy ra vào những ngày khác nhau trong cùng một chương trình, thì số lượng hàng dữ liệu trong kết quả sẽ bị tăng lên. Và như vậy, sẽ phá hỏng báo cáo bạn đã thiết lập cho đến nay.

Giải pháp đơn giản là chúng ta sẽ tạo ra một báo cáo mới để tập hợp dữ liệu theo cách khác. Ví dụ chúng ta sẽ chỉ lấy số tiền, không lấy tổng, và ngày của tất cả các giao dịch quyên góp cho các chương trình gây quỹ mà cộng tác viên đã quảng bá.  Sau đó, copy và nhúng bộ nhu liệu bên dưới của nó vào báo cáo hiện hành.

Ngoài ra, để tiết kiệm tính toán, khi tập hợp nhu liệu chúng ta cũng muốn tính luôn số hoa hồng cộng tác viên nhận được trên mỗi giao dịch, bằng cách nhân tỷ lệ hoa hồng với số tiền quyên góp và thêm vào trong dữ liệu kết xuất.

Quá trình này được gọi là tiền xử lý dữ liệu thô.

## Tiền Xử Lý

Trước tiên hãy tạo một báo cáo tên là `ONEIRO_AF_CP`, và gọi nó là Quảng Bá & Thu Nhập, có cùng nguồn nhu liệu là `ONEIRO_AF_TX.`

<figure><img src="https://570479789-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FthFCMd6I0N27abdqAJLZ%2Fuploads%2FO0ePFVFzySPz7ahF9OqE%2FScreen%20Shot%202024-03-02%20at%207.54.55%20AM.png?alt=media&amp;token=2415489c-9a2d-449a-9583-3a4f5469d281" alt=""><figcaption><p>Tạo báo cáo quảng bá và thu nhập</p></figcaption></figure>

Nguồn nhu liệu `ONEIRO_AF_TX` chứa tất cả các giao dịch của tất cả các chương trình cho tất cả cộng tác viên. Bạn cần lọc ra để chỉ thu thập các giao dịch cho một cộng tác viên có địa chỉ ví nhất định.

Ngoài ra, bạn cần lấy thông tin số tiền và ngày quyên góp, và hoa hồng sẽ được tính bằng số tiền quyên góp nhân cho tỷ lệ hoa hồng (*`affiliate_fee`*). Thực hiện các bước sau:

1. Kéo cốt địa chỉ ví của cộng tác viên (*`address`*) vào lưới bộ lọc phía trên và tạm thời nhập giá trị *`0x78a02bb94b324bd2d671ba32f644530b55a0271e`* vào ô trong cột Giá trị.
2. Kéo cột ngày giao dịch (*`transaction_date`*) bên dưới `ONEIRO_DT_TX` vào lưới kết xuất.
3. Kéo cột số tiền (*`amount`*) bên dưới `ONEIRO_DT_TX` vào lưới kết xuất.

Để tính trực tiếp hoa hồng, hãy kéo cột số tiền một lần nữa vào lưới kết xuất. Sau đó, bên cột <mark style="color:yellow;">Bí Danh:\[Công Thức]</mark> nhập công thức sau:

```
commission:ONEIRO_DT_TX.amount * ONEIRO_DT_CP.affiliate_fee / 100
```

<figure><img src="https://570479789-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FthFCMd6I0N27abdqAJLZ%2Fuploads%2FFg6Scr2POp5TjWHSvq3Y%2FScreen%20Shot%202024-03-02%20at%208.38.49%20AM.png?alt=media&amp;token=69cc708b-3ff4-4a2a-bac0-092c0c74017d" alt=""><figcaption><p>Tập hợp dữ liệu hoa hồng trên giao dịch</p></figcaption></figure>

Khi bạn chạy báo cáo, bộ dữ liệu sẽ trông giống như sau:

<figure><img src="https://570479789-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FthFCMd6I0N27abdqAJLZ%2Fuploads%2FR7tqX4eVtsfsoW2OTEnD%2FScreen%20Shot%202024-03-02%20at%208.52.47%20AM.png?alt=media&amp;token=07fe318a-fa70-47e9-8883-87dd15b8df99" alt="" width="563"><figcaption><p>Nhu liệu sẽ được nhúng vào báo cáo</p></figcaption></figure>

## Công Thức

Nói thêm về các công thức tiền xử lý. Ngoài các các toán tử thông thường, KNOWINS hỗ trợ  các hàm xử lý dữ liệu thông dụng. Dưới đây là một số ít hàm tiêu biểu:

<table><thead><tr><th width="135">Hàm</th><th width="225">Cú pháp</th><th>Giải thích</th></tr></thead><tbody><tr><td>ABS</td><td><p>ABS( column )</p><p>ABS( expression )</p></td><td>Trả về giá trị tuyệt đối của một cột hoặc một biểu thức</td></tr><tr><td>ROUND</td><td>ROUND( expression , length)</td><td>Làm tròn giá trị với số lẻ xác định bởi tham số length</td></tr><tr><td>FLOOR</td><td><p>FLOOR( column )</p><p>FLOOR( expression )</p></td><td>Trả về số nguyên lớn nhất nhỏ hơn hoặc bằng giá trị của biểu thức</td></tr><tr><td>CONCAT</td><td>CONCAT( string1 , string2 [ , stringN ] ... )</td><td>Nối các chuỗi lại với nhau</td></tr><tr><td>LEFT</td><td>LEFT( string, N )</td><td>Trả về N ký tự bên trái của chuỗi ký tự.</td></tr><tr><td>RIGHT</td><td>RIGHT( string, N )</td><td>Trả về N ký tự bên phải của chuỗi ký tự.</td></tr><tr><td>SUBSTR</td><td>SUBSTRING( string, start, N )</td><td>Trả về chuỗi ký tự bên trong từ vị trí bắt đầu  và kéo dài N ký tự.</td></tr><tr><td>TRIM</td><td>TRIM( string )</td><td>Xóa các khoảng trắng trước và sau chuỗi ký tự.</td></tr><tr><td>COALESCE</td><td>COALESCE( expression [ ,...n ] )</td><td>Trả về giá trị đầu tiên khác NULL.</td></tr><tr><td>NULLIF</td><td>NULLIF( expression , expression )</td><td>Trả về NULL nếu hai giá trị bằng nhau, ngược lại trả về giá trị đầu tiên.</td></tr><tr><td>DISTINCT</td><td>Alias: DISTINCT col1, col2</td><td><p></p><p>Lấy ra tổ hợp các giá trị duy nhất của các cột col1, col2…</p><p></p><p>Lưu ý: </p><ul><li>Nếu được sử dụng, DISTINCT phải là hàng duy nhất có trong lưới kết xuất.</li><li>Tên bí danh (Alias) được gán cho cột cuối cùng, nếu có nhiều cột.</li></ul></td></tr><tr><td>SUM</td><td><p>SUM( column )</p><p>SUM( expression )</p></td><td><p></p><p>Tính tổng. Nếu được sử dụng, SUM phải là hàng duy nhất trong lưới kết xuất, hoặc tất cả các hàng còn lại trong lưới kết xuất cũng được tính với SUM, AVG, COUNT, MAX, MIN.</p></td></tr><tr><td>AVG</td><td>AVG( expression )</td><td><p></p><p>Tính trung bình. Nếu được sử dụng, AVG phải là hàng duy nhất trong lưới kết xuất, hoặc tất cả các hàng còn lại trong lưới kết xuất cũng được tính với SUM, AVG, COUNT, MAX, MIN.</p></td></tr><tr><td>COUNT</td><td>COUNT( column )</td><td>Đếm. Nếu được sử dụng, COUNT phải là hàng duy nhất trong lưới kết xuất, hoặc tất cả các hàng còn lại trong lưới kết xuất cũng được tính với SUM, AVG, COUNT, MAX, MIN.</td></tr><tr><td>MAX</td><td>MAX( expression )</td><td><p></p><p>Tìm giá trị lớn nhất. Nếu được sử dụng, MAX phải là hàng duy nhất trong lưới kết xuất, hoặc tất cả các hàng còn lại trong lưới kết xuất cũng được tính với SUM, AVG, COUNT, MAX, MIN.</p></td></tr><tr><td>MIN</td><td>MIN( expression )</td><td><p></p><p>Tìm giá trị nhỏ nhất. Nếu được sử dụng, MIN phải là hàng duy nhất trong lưới kết xuất, hoặc tất cả các hàng còn lại trong lưới kết xuất cũng được tính với SUM, AVG, COUNT, MAX, MIN.</p></td></tr></tbody></table>

{% hint style="info" %}
Nếu bạn biết về SQL, bạn có thể sử dụng tất cả các hàm xử lý dữ liệu của SQL tương thích với nguồn dữ liệu (MS SQL, MariaDB, MySQL, Postgres, Oracle) của bạn cho các công thức tiền xử lý.
{% endhint %}

## Nhúng Nhu Liệu

Tiếp theo chúng ta sẽ "nhúng" bộ nhu liệu mới tạo vào báo cáo thu nhập để lấy số liệu vẽ đồ thị. Nhớ lại trong bảng cấu hình, cột A là nơi định nghĩa các bộ nhu liệu và cột B là nguồn dữ liệu của các bộ nhu liệu đó. KNOWINS hỗ trợ lệnh `USER TABLE` cho phép bạn nhúng các bộ nhu liệu từ bên ngoài vào trong báo cáo theo hai bước đơn giản:

**Bước 1**: Nhấn vào nút <mark style="color:yellow;">Dataset</mark> để copy công thức tạo nhu liệu của báo cáo Quảng Bá & Thu Nhập, `ONEIRO_AF_CP`, vào clipboard.&#x20;

<figure><img src="https://570479789-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FthFCMd6I0N27abdqAJLZ%2Fuploads%2FLXRNpXfRu8kiXrmwzUqw%2FScreen%20Shot%202024-03-03%20at%209.06.39%20AM.png?alt=media&amp;token=667ed2f0-bfc8-40da-b2c0-9aca70d0ed4e" alt=""><figcaption><p>Copy công thức bộ nhu liệu</p></figcaption></figure>

```
USER TABLE(QUERY_DB({"from":"ONEIRO_AF_TX","select":[{"node":"ONEIRO_AF_TX\\ONEIRO_DT_TX\\created_on","name":"transaction_date","alias":"","datatype":"D","aggregate":"","expression":"","sorting":""},{"node":"ONEIRO_AF_TX\\ONEIRO_DT_TX\\amount","name":"amount","alias":"","datatype":"N","aggregate":"","expression":"","sorting":""},{"node":"ONEIRO_AF_TX\\ONEIRO_DT_TX\\amount","name":"amount","alias":"commission","datatype":"N","aggregate":"","expression":"amount * affiliate_fee / 100","sorting":""}],"where":[{"node":"ONEIRO_AF_TX\\address","name":"address","alias":"","datatype":"","filterfrom":"0x78a02bb94b324bd2d671ba32f644530b55a0271e","filterto":"","isnot":"N","operator":"WALLET"}]},ONEIRO_AF_CP))
```

Nếu bạn tò mò thì công thức trông như sau (`USER TABLE` dùng để khai báo một bộ nhu liệu nhúng, và `QUERY_DB` để lấy dữ liệu từ nguồn dữ liệu):

```
USER TABLE(QUERY_DB(
{
  "from": "ONEIRO_AF_TX",
  "select": [
    {
      "node": "ONEIRO_AF_TX\\ONEIRO_DT_TX\\created_on",
      "name": "transaction_date",
      "alias": "",
      "datatype": "D",
      "aggregate": "",
      "expression": "",
      "sorting": ""
    },
    {
      "node": "ONEIRO_AF_TX\\ONEIRO_DT_TX\\amount",
      "name": "amount",
      "alias": "",
      "datatype": "N",
      "aggregate": "",
      "expression": "",
      "sorting": ""
    },
    {
      "node": "ONEIRO_AF_TX\\ONEIRO_DT_TX\\amount",
      "name": "amount",
      "alias": "commission",
      "datatype": "N",
      "aggregate": "",
      "expression": "amount * affiliate_fee / 100",
      "sorting": ""
    }
  ],
  "where": [
    {
      "node": "ONEIRO_AF_TX\\address",
      "name": "address",
      "alias": "",
      "datatype": "",
      "filterfrom": "0x78a02bb94b324bd2d671ba32f644530b55a0271e",
      "filterto": "",
      "isnot": "N",
      "operator": "WALLET"
    }
  ]
}
,ONEIRO_AF_CP))
```

{% hint style="info" %}
Công thức này sẽ lấy từ bộ nhu liệu `ONEIRO_AF_TX` (*`from: ...`*)  các cột *`transaction_date`*, *`amount`* và *`commission`*  ̣(*`select: ...`*) , theo các điều kiện lọc  ̣(*`where: ...`*).
{% endhint %}

**Bước 2**: Bây giờ hãy quay lại mở file Excel mẫu báo cáo của báo cáo thu nhập. Đi vào bảng `<#Config>` và dán công thức này vào một ô trong cột B, ví dụ B16. Đặt tên cho bộ nhu liệu lấy từ công thức này là *`Transaction`* trong ô A16.

<figure><img src="https://570479789-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FthFCMd6I0N27abdqAJLZ%2Fuploads%2FaTZ1s8oztkh4yj1T6hAw%2FScreen%20Shot%202024-03-03%20at%2010.48.13%20AM.png?alt=media&amp;token=2a19ff02-70be-4c5f-a7b2-df8b99273fff" alt=""><figcaption><p>Nhúng bộ nhu liệu vào báo cáo</p></figcaption></figure>

## Hậu Xử Lý

Đến đây bạn đã có được dữ liệu bao gồm ngày tháng, số tiền quyên góp và hoa hồng được nhúng vào báo cáo thu nhập dưới tên bộ nhu liệu *`Transaction`*. Các dữ liệu này đã được lọc theo địa chỉ ví của cộng tác liên nên tổng số tiền hoa hồng sẽ chính là hoa hồng của cộng tác viên đó.

Tiếp theo chúng ta cần tính tổng số tiền hoa hồng theo các khoảng thời gian cho 3 ngày trước, tuần trước, tháng trước, quí trước và năm trước để lấy số liệu vẽ đồ thị.

Chúng ta sẽ sử dụng lại thẻ hàm tính gộp có điều kiện  *`Aggregate`* để thực hiện điều này. Đi đến bảng *`<#Config>`* và định nghĩa các thẻ hàm sau:

{% code overflow="wrap" %}

```
M21: Earnings3
N21: <#Aggregate(SUM;Transaction;<#Transaction.commission>;DAYS(NOW(),<#Transaction.transaction_date>) < 3)>

M22: Earnings7
N22: <#Aggregate(SUM;Transaction;<#Transaction.commission>;DAYS(NOW(),<#Transaction.transaction_date>) < 7)>

M23: Earnings30
N23: <#Aggregate(SUM;Transaction;<#Transaction.commission>;DAYS(NOW(),<#Transaction.transaction_date>) < 30)>

M24: Earnings90
N24: <#Aggregate(SUM;Transaction;<#Transaction.commission>;DAYS(NOW(),<#Transaction.transaction_date>) < 90)>

M25: Earnings365
N25: <#Aggregate(SUM;Transaction;<#Transaction.commission>;DAYS(NOW(),<#Transaction.transaction_date>) < 365)>

M26: EarningsGT365
N26: <#Aggregate(SUM;Transaction;<#Transaction.commission>;DAYS(NOW(),<#Transaction.transaction_date>) < 999999999)>
```

{% endcode %}

<figure><img src="https://570479789-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FthFCMd6I0N27abdqAJLZ%2Fuploads%2FpnhbFh1TMcL43EmJVClB%2FScreen%20Shot%202024-03-04%20at%201.46.05%20PM%202.png?alt=media&amp;token=3e33278d-2fa7-4be9-9a1c-95d9ffb20055" alt=""><figcaption><p>Định nghĩa các thẻ Earnings</p></figcaption></figure>

Giải thích:

1. Ô M21 xác định một thẻ tên *`Earnings3`*.
2. Ô N21 là định nghĩa của thẻ tên này:  Nó dùng thẻ hàm `<#Aggregate(...)>` để duyệt qua các hàng của bộ nhu liệu và áp dụng hàm tính gộp TỔNG (*`SUM`*), cho giá trị trong cột số tiền hoa hồng (*`commission`*) của bộ nhu liệu *`Transaction`*.
   * `DAYS` là hàm của Excel dùng để tính số ngày cách biệt giữa hai ngày. `NOW()` là một hàm khác của Excel trả về giá trị của ngày hôm nay. Trong trường hợp này, hàm `DAYS` tính số ngày khác biết giữa hôm nay và ngày xảy ra giao dịch (*`transaction_date`*)
   * Thẻ hàm hiểu được các hàm của Excel bên trong nó. Khi áp dụng hàm tính gộp SUM, thẻ hàm Aggregate sẽ lọc ra chỉ lấy các dữ liệu thỏa mãn điều kiện số ngày khác biệt không quá 3 ngày: *DAYS(NOW(),<#Transaction.transaction\_date>) < 3*
   * Kết quả là thẻ hàm *`Earnings3`* sẽ tính được tổng số tiền hoa hồng cộng tác viên kiếm được trong 3 ngày gần nhất
3. Tương tự như vậy cho các thẻ hàm còn lại *`Earnings7`*, *`Earnings30`*, *`Earnings90`*, *`Earnings365`*, *`EarningsGT365`*.

Để vẽ đồ thị bạn cần phải sắp xếp các dữ liệu này vào một bảng dữ liệu trong mẫu báo cáo. Hãy chèn  một bảng mới, đặt tên là `DATA` vào trong mẫu báo cáo Excel, và tạo mật dải tên *`EarningsByPeriod`* như sau:

<figure><img src="https://570479789-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FthFCMd6I0N27abdqAJLZ%2Fuploads%2FDjAFr0TmbqrSgpsPj1dP%2FScreen%20Shot%202024-03-04%20at%201.58.32%20PM.png?alt=media&amp;token=32e0065b-ef8e-4abe-bac7-f4f0598aadf5" alt=""><figcaption><p>Xây dựng dữ liệu cho đồ thị</p></figcaption></figure>

Giải thích:

1. Cột A1 và B1 là tiêu đề của hai cột giá trị dùng cho đồ thị.  Cột A sẽ được dùng làm giá trị cho trục X, và cột B cho trục Y.
2. Dải các ô từ A1:B7 sẽ là bảng dữ liệu để vẽ đồ thị, được định nghĩa bằng dải tên *`EarningsByPeriod`*.

## Vẽ đồ thị

Đi vào bảng trình bày của báo cáo và trộn dải các ô từ C10 đến D22 lại để lấy làm vị trí sẽ vẽ đồ thị. Nhắp chuột phải trên ô vừa trộn và chọn <mark style="color:yellow;">New Note</mark> để thêm vào một lệnh vẽ đồ thị, *`ERN_PRD`* là tên của đồ thị:

```
CHART:ERN_PRD
```

<figure><img src="https://570479789-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FthFCMd6I0N27abdqAJLZ%2Fuploads%2FelS4fzZLsIRxiujINtr6%2FScreen%20Shot%202024-03-05%20at%208.35.28%20AM.png?alt=media&amp;token=60392e29-0afa-4d15-8bd4-153a2ee84170" alt="" width="563"><figcaption><p>Lệnh vẽ đồ thị ERN_PRD</p></figcaption></figure>

Cuối cùng, quay lại báo cáo thu nhập, nhấn vào biểu tượng đồ thị và thêm vào một đồ thị có tên là *`ERN_PRD`* và dải dữ liệu là *`EarningsByPeriod`*, sau đó chọn loại đồ thị và giá trị các trục như hướng dẫn trong bài trước.

<figure><img src="https://570479789-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FthFCMd6I0N27abdqAJLZ%2Fuploads%2F5RhMPrMF4WJqXVE5qW4C%2FScreen%20Shot%202024-03-07%20at%2011.16.57%20AM.png?alt=media&amp;token=4669e649-0a69-4a87-9893-80955dfd2ba3" alt="" width="563"><figcaption><p>Đồ thị thu nhập theo thời gian</p></figcaption></figure>

Lưu và chạy lại báo cáo để kiểm tra kết quả.

<figure><img src="https://570479789-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FthFCMd6I0N27abdqAJLZ%2Fuploads%2FwN44PMxeQ20g7boUzeSU%2FScreen%20Shot%202024-03-07%20at%2011.25.57%20AM.png?alt=media&amp;token=e5787ae8-a736-468f-9c6f-d57f3741c8ca" alt=""><figcaption><p>Đồ thị thu nhập theo thời gian &#x26; chương trình</p></figcaption></figure>

Có một vấn đề đối với bộ nhu liệu *`Transaction`*. Đó là nó được lọc để chỉ lấy các giao dịch liên quan đến cộng tác viên có địa chỉ ví là *`0x78a02bb94b324bd2d671ba32f644530b55a0271e`*.  Chúng ta muốn báo cáo này phải chạy đúng cho bất kỳ cộng tác viên nào. Nói cách khác, nếu người dùng nhập một địa chỉ khác vào lưới bộ lọc, thì bộ nhu liệu *`Transaction`* phải lấy các giao dịch liên quan đến địa chỉ ví đó.

Nhớ lại là chúng ta đã định nghĩa thẻ *`Affiliate`* để lấy vào địa chỉ ví của cộng tác viên từ lưới bộ lọc. Bạn có thể thay thẻ này vào địa chỉ ví cộng tác viên trong công thức nhúng nhu liệu để giải quyết vấn đề đó.&#x20;

<figure><img src="https://570479789-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FthFCMd6I0N27abdqAJLZ%2Fuploads%2F19EXnnZOm46MgCO4Iy6i%2FScreen%20Shot%202024-03-07%20at%2011.42.52%20AM.png?alt=media&amp;token=667c65c6-1ca5-4a95-80fa-dbaea795c35d" alt=""><figcaption><p>Sử dụng thẻ trong công thức nhúng nhu liệu</p></figcaption></figure>

Lưu và tải mẫu báo cáo mới lên. Sau đó chạy với những địa chỉ ví cộng tác viên khác nhau để so sánh kết quả.

Để thuận tiện, bạn có thể tài mẫu báo cáo đã hoàn thiện về tại đầy:&#x20;

{% file src="/files/DZwT7ocNUxzIq0CiN6iy" %}
