Gå till huvudinnehåll

Kombinera tabeller med Join och Keep

PÅ DEN HÄR SIDAN

Kombinera tabeller med Join och Keep

En operation som slår samman två tabeller till en. Posterna i den skapade tabellen är kombinationer av posterna i de ursprungliga tabellerna, vanligtvis på så sätt att de två poster som bidrar till någon given kombination i den skapade tabellen har ett gemensamt värde för ett eller flera gemensamma fält – en så kallad natural join. I Qlik Sense kan joins göras i skriptet. Resultatet blir en logisk tabell.

Det är möjligt att länka tabeller redan i skriptet. Qlik Sense-logiken ser då inte de separata tabellerna, utan bara den interna tabell som länkningen resulterat i. Ibland kan detta vara nödvändigt, men det finns nackdelar:

  • De inlästa tabellerna blir ofta större och Qlik Sense arbetar långsammare.
  • En del information kan gå förlorad; det går ofta inte längre att få frekvensuppgifter (antal poster) om den ursprungliga tabellen.

Keep-funktionen, som reducerar den ena tabellen eller båda tabellerna till det gemensamma snittet av tabelldata innan tabellerna sparas i Qlik Sense, har utvecklats för att minska antalet fall där man måste använda funktionen explicit join.

Observera: I denna dokumentation används vanligen termen join för att beteckna länkningar som gjordes innan de interna tabellerna skapades. Associationen, som görs när de interna tabellerna har skapats, är emellertid i allt väsentligt också en länkning (join).

Join

En länkning skapas enklast med hjälp av Join-prefixet i skriptet, som länkar samman den interna tabellen med en annan namngiven tabell eller med den senast skapade tabellen. Länkningen blir en outer join, som skapar alla möjliga kombinationer av värden från två tabeller.

Example:  

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

Den interna tabell som blir resultatet får fälten a, b, c och d. Antalet poster varierar beroende på fältvärdena i de två tabellerna.

Observera: Fälten som länkar tabellerna måste ha identiska namn. Hur många fält man använder för länkningen spelar ingen roll. Vanligen ska tabellerna ha ett eller flera fält gemensamt. Om det inte finns något gemensamt fält kommer länkningen att resultera i den kartesiska produkten av tabellerna. Det är också möjligt att länka tabeller där alla fält är gemensamma, men det finns oftast ingen mening med det. Join-prefixet använder sig av den senast skapade interna tabellen såvida inte namnet på en tidigare inläst tabell har angetts i Join-satsen. Ordningen på de två satserna är således inte godtycklig.

Mer information finns i Join.

Använda Join

Det explicita Join prefixet i Qlik Sense-skriptspråket skapar en fullständig länkning (full join) mellan de båda tabellerna. Resultatet är en tabell. Sådana länkningar ger ofta mycket stora tabeller.

  1. Öppna appen Avancerad skriptvägledning.
  2. Lägg till ett nytt skriptavsnitt i Skriptredigeraren.
  3. Kalla avsnittet Transactions.
  4. Klicka på Välj data under AttachedFiles i menyn till höger.

  5. Ladda upp och välj sedan Transactions.csv.
  6. Tips: Se till att Inbäddade fältnamn under Fältnamn har valts för att inkludera namnen på tabellfälten när du laddar data.
  7. Klicka på Infoga skript i fönstret Välj data från.
  8. Ladda upp och välj sedan Salesman.xlsx.
  9. Klicka på Infoga skript i fönstret Välj data från.
  10. Ditt skript bör se ut så här:

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

  11. Klicka på Ladda data.
  12. Öppna datamodellvyn. Datamodellen ser ut så här:
  13. Datamodell: Tabellerna Transactions, Salesman och Product
    Data model, Transactions, Salesman, and Product tables.

Att hålla isär tabellerna Transactions och Salesman ger kanske inte det resultat som krävs. Det kan vara bättre att slå samman de två tabellerna.

  1. Ge den sammanslagna tabellen ett namn genom att lägga till följande rad ovanför den första LOAD-satsen:
  2. Transactions:

  3. Om du vill koppla ihop tabellerna Transactions och Salesman lägger du till följande rad ovanför den andra LOAD-satsen:
  4. Join(Transactions)

    Ditt skript bör se ut så här:

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

  5. Klicka på Ladda data.
  6. Öppna datamodellvyn. Datamodellen ser ut så här:
  7. Datamodell:Tabellerna Transactions och Product
    Data model following Join.

    Alla fälten i tabellerna Transactions och Salesman har nu kombinerats till en enda Transactions-tabell.

Observera: Mer information om när Join ska användas finns i följande blogginlägg i Qlik Community: To Join or not to Join (Använda länkning eller inte) och Mapping as an Alternative to Joining (Mappning som ett alternativ till länkning). Beteenden diskuteras i ett sammanhang som avser QlikView. Logiken gäller dock i samma utsträckning för Qlik Sense.

Keep

En av finesserna med Qlik Sense är just att programmet gör associationer mellan tabeller istället för att skapa länkningar, vilket minskar utrymmet i minnet, ökar hastigheten och ger större flexibilitet. Keep-funktionaliteten har utformats för att minska antalet fall där explicit länkning måste användas.

När prefixet Keep används mellan två LOAD- eller SELECT-satser reduceras den ena tabellen eller båda tabellerna till snittet av tabelldata innan de lagras i Qlik Sense. Prefixet Keep måste alltid inledas med något av följande nyckelord: Inner, Left eller Right. Urvalet av poster från tabellerna görs på samma sätt som i en motsvarande koppling. Skillnaden är att tabellerna inte länkas utan lagras i Qlik Sense som två tabeller med olika namn.

Mer information finns i Keep.

Inner

Prefixen Join och Keep i dataladdningsskriptet kan föregås av prefixet Inner.

Om det används framför Join, anger det att länkningen mellan de båda tabellerna ska vara en inre länkning (inner join). Den tabell som blir resultatet innehåller enbart kombination mellan de två tabellerna med en fullständig datauppsättning från båda sidor.

Om de används framför Keep, anger det att tabellerna ska reduceras till det gemensamma snittet av deras datamängder innan de lagras i Qlik Sense.

Example:  

I de här exemplen använder vi källtabellerna Table1 och Table2.

Observera att det här bara är exempel. Det finns inga övningar för dessa data att göra i Qlik Sense.

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

Inner Join

Först utför vi en Inner Join på tabellerna. Det resulterar i att VTable bara innehåller en rad, den enda posten som förekommer i båda tabellerna, med kombinerade data från båda tabellerna.

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

VTable
A B C
1 aa xx

Inner Keep

Om vi i stället utför en Inner Keep har vi fortfarande två tabeller. De två tabellerna associeras via det gemensamma fältet A.

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

VTab1
A B
1 aa
VTab2
A C
1 xx

Mer information finns i Inner.

Left

Prefixen Join och Keep i dataladdningsskriptet kan föregås av prefixet left.

Om det används framför Join, anger det att länkningen mellan de båda tabellerna ska vara vänsterriktad (left join). En sådan länkning resulterar i en tabell som endast innehåller kombinationer där datauppsättningen från den första tabellen är fullständig.

Om det används framför Keep, anger det att den andra tabellen ska reduceras till det gemensamma snittet med den första tabellen innan den lagras i Qlik Sense.

Example:  

I de här exemplen använder vi källtabellerna Table1 och Table2.

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

Först utför vi en Left Join på tabellerna. Resultatet blir att VTable innehåller alla rader från Table1, kombinerade med fält från matchande rader i Table2.

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

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

Om vi i stället utför en Left Keep har vi fortfarande två tabeller. De två tabellerna associeras via det gemensamma fältet 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

Mer information finns i Left.

Right

Prefixen Join och Keep i Qlik Sense-skriptspråket kan föregås av prefixet right.

Om det används framför Join, anger det att länkningen mellan de båda tabellerna ska vara högerriktad (right join). En sådan länkning resulterar i en tabell som endast innehåller kombinationer där datamängden från den andra tabellen är fullständig.

Om det används framför Keep, anger det att den första tabellen ska reduceras till det gemensamma snittet med den andra tabellen innan den lagras i Qlik Sense.

Example:  

I de här exemplen använder vi källtabellerna Table1 och Table2.

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

Först utför vi en Right Join på tabellerna. Resultatet blir att VTable innehåller alla rader från Table2, kombinerade med fält från matchande rader i Table1.

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

VTable
A B C
1 aa xx
4 - yy

Om vi i stället utför en Right Keep har vi fortfarande två tabeller. De två tabellerna associeras via det gemensamma fältet A.

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

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

Mer information finns i Right.