跳到主要內容

使用 JoinKeep 來合併表格

聯結是將兩個表格結合成一個表格的操作。產生的表格記錄是原始表格記錄的組合,通常以這種方式在所產生表格中形成任何指定組合的兩個記錄,會具有一或數個通用欄位的通用值,也稱為「自然聯結」。在 Qlik Sense 中,可在指令碼中建立聯結,進而產生邏輯表。

可聯結已在指令碼中的表格。之後,Qlik Sense 邏輯不會看到個別的表格,而是聯結的結果,亦即單一的內部表格。在某些情況下這是必要的,但會有一些缺點:

  • 載入的表格通常會變得較大,使得 Qlik Sense 運作較慢。
  • 某些資訊可能會遺失:原始表格內的頻率 (記錄筆數) 可能不再可用。

Keep 功能可將兩個表格的其中一個或兩個都先減少到表格資料的交集,然後才儲存到 Qlik Sense 中,這是專門設計用來減少需要使用明確聯結的情況。

資訊備註本手冊中的「聯結」一詞通常指的是內部表格建立之前所進行的聯結。不過,在內部表格建立之後所進行的關聯基本上也算是聯結。

Join

進行聯結的最簡單方式,是在指令碼中使用 Join 前置詞,如此會將內部表格聯結到另一個具名的表格,或是聯結到上一個建立的表格。這樣的聯結算是外部聯結,會從兩個表格建立所有可能的值組合。

範例:  

LOAD a, b, c from table1.csv; join LOAD a, d from table2.csv;

產生的內部表格會有欄位 abcd。而記錄筆數會視這兩個表格的欄位值而定。

資訊備註要聯結之欄位的名稱必須完全相同。要聯結的欄位數目可任意。通常表格應會有一個或數個通用欄位。若無通用欄位,則會呈現表格的笛卡兒座標的乘積。也可能所有欄位都是通用的,但這通常毫無意義。除非 Join 陳述式中指定先前已載入表格的表格名稱,否則 Join 前置詞會使用上一個建立的表格。因此,兩個陳述式的順序不可任意排序。

如需詳細資訊,請參閱Join

使用 Join

Qlik Sense 指令碼語言中明確的 Join 前置詞會執行兩個表格的完整聯結。結果會是一個表格。這樣的聯結通常會產生非常大的表格。

  1. 開啟進階指令碼教學課程應用程式。
  2. 資料載入編輯器中新增新的指令碼區段。
  3. 叫用區段 Transactions
  4. 在右側功能表的 DataFiles 之下,按一下選取資料

  5. 上傳然後選取 Transactions.csv
  6. 提示備註欄位名稱下,確保已選取內嵌欄位名稱,以便載入資料時包含表格欄位的名稱。
  7. 從以下項目選取資料視窗中,按一下插入指令碼
  8. 上傳然後選取 Salesman.xlsx
  9. 從以下項目選取資料視窗中,按一下插入指令碼
  10. 您的指令碼應如下所示:

    LOAD "Transaction ID", "Salesman ID", Product, "Serial No", "ID Customer", "List Price", "Gross Margin" FROM [lib://DataFiles/Transactions.csv] (txt, codepage is 28591, embedded labels, delimiter is ',', msq); LOAD "Salesman ID", Salesman, "Distributor ID" FROM [lib://DataFiles/Salesman.xlsx] (ooxml, embedded labels, table is Salesman);

  11. 按一下載入資料
  12. 開啟資料模型檢視器。資料模型應如下所示:
  13. 資料模型:TransactionsSalesmanProduct 表格

    資料模型、交易、銷售人員和產品表格。

不過,讓 TransactionsSalesman 表格分離可能不是所需結果。這可能比聯結兩個表格更好。

  1. 若要設定聯結表格的名稱,在第一個 LOAD 陳述式之上新增下列行:
  2. Transactions:

  3. 若要聯結 TransactionsSalesman 表格,在第二個 LOAD 陳述式之上新增下列行:
  4. Join(Transactions)

    您的指令碼應如下所示:

    Transactions: LOAD     "Transaction ID",     "Salesman ID",     Product,     "Serial No",     "ID Customer",     "List Price",     "Gross Margin" FROM [lib://DataFiles/Transactions.csv] (txt, codepage is 28591, embedded labels, delimiter is ',', msq);  Join(Transactions) LOAD     "Salesman ID",     Salesman,     "Distributor ID" FROM [lib://DataFiles/Salesman.xlsx] (ooxml, embedded labels, table is Salesman);

  5. 按一下載入資料
  6. 開啟資料模型檢視器。資料模型應如下所示:
  7. 資料模型: TransactionsProduct 表格

    加入後的資料模型。

    TransactionsSalesman 表格中的所有欄位現已合併成為單一的 Transactions 表格。

資訊備註若要進一步瞭解使用 Join 的時機,請在 Qlik Community 中參閱這些部落格貼文:To Join or not to Join (是否要聯結)Mapping as an Alternative to Joining (作為替代選項對應聯結)。 行為會在 QlikView 的上下文中討論。不過,邏輯同樣適用於 Qlik Sense

Keep

Qlik Sense 的其中一個主要特色是可在表格之間建立關聯而不是聯結,這可降低所佔的記憶體空間、提高速度,並帶來極大的靈活性。Keep 功能是專門用來減少需要使用明確聯結的情況。

兩個 LOADSELECT 陳述式之間的 Keep 前置詞,可將這兩個表格的其中一個或兩個都先減少到表格資料的交集,然後才儲存到 Qlik Sense 中。Keep 前置詞前面一律必須加上 InnerLeftRight 前置詞的其中一個。從表格選取記錄的方式和對應聯結所使用的方式相同。不過,兩個表格並未聯結,而是以兩個個別的具名表格儲存在 Qlik Sense 中。

如需詳細資訊,請參閱 Keep

Inner

在資料載入指令碼語言中,JoinKeep 前置詞的前面可以加上 Inner 前置詞。

若加在 Join 之前,是指定兩個表格之間的聯結必須為內部聯結。產生的表格僅會包含兩個表格之間,具備兩邊完整資料集的組合。

若加在 Keep 之前,是指定兩個表格應先減少到其共同交集,然後才儲存到 Qlik Sense 中。

範例:  

在此範例中,我們使用來源表格 Table1Table2

請注意,這些只是範例。在 Qlik Sense 中沒有要完成的附帶活動。

Table 1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

Inner Join

首先,我們會在表格上執行 Inner Join,產生 VTable,僅包含一個列,存在於兩個表格中的唯一記錄,擁有從兩個表格合併的資料。

VTable: SELECT * from Table1; inner join SELECT * from Table2;

VTable
A B C
1 aa xx

Inner Keep

如果我們改而執行 Inner Keep,仍然會有兩個表格。兩個表格是透過通用欄位 A 建立關聯。

VTab1: SELECT * from Table1; VTab2: inner keep SELECT * from Table2;

VTab1
A B
1 aa
VTab2
A C
1 xx

如需詳細資訊,請參閱Inner

Left

在資料載入指令碼語言中,JoinKeep 前置詞的前面可以加上 left 前置詞。

若加在 Join 之前,是指定兩個表格之間的聯結必須為左方聯結。產生的表格僅會包含兩個表格之間,具備第一個表格完整資料集的組合。

若加在 Keep 之前,是指定第二個表格應先減少到與第一個表格的共同交集,然後才儲存到 Qlik Sense 中。

範例:  

在此範例中,我們使用來源表格 Table1Table2

Table1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

首先,我們會在表格上執行 Left Join,產生 VTable,包含來自 Table1 的所有列,合併 Table2 中符合列的欄位。

VTable: SELECT * from Table1; left join SELECT * from Table2;

VTable
A B C
1 aa xx
2 cc -
3 ee -

如果我們改而執行 Left Keep,仍然會有兩個表格。兩個表格是透過通用欄位 A 建立關聯。

VTab1: SELECT * from Table1; VTab2: left keep SELECT * from Table2;

VTab1
A B
1 aa
2 cc
3 ee
VTab2
A C
1 xx

如需詳細資訊,請參閱Left

Right

Qlik Sense 指令碼語言中,JoinKeep 前置詞的前面可以加上 right 前置詞。

若加在 Join 之前,是指定兩個表格之間的聯結必須為右方聯結。產生的表格僅會包含兩個表格之間,具備第二個表格完整資料集的組合。

若加在 Keep 之前,是指定第一個表格應先減少到與第二個表格的共同交集,然後才儲存到 Qlik Sense 中。

範例:  

在此範例中,我們使用來源表格 Table1Table2

Table1
A B
1 aa
2 cc
3 ee
Table2
A C
1 xx
4 yy

首先,我們會在表格上執行 Right Join,產生 VTable,包含來自 Table2 的所有列,合併 Table1 中符合列的欄位。

VTable: SELECT * from Table1; right join SELECT * from Table2;

VTable
A B C
1 aa xx
4 - yy

如果我們改而執行 Right Keep,仍然會有兩個表格。兩個表格是透過通用欄位 A 建立關聯。

VTab1: SELECT * from Table1; VTab2: right keep SELECT * from Table2;

VTab1
A B
1 aa
VTab2
A C
1 xx
4 yy

如需詳細資訊,請參閱Right