top of page

Subfield() för att dela strängar

Subfield() är en script- och diagramfunktion i QlikView och Qlik Sense som låter oss dela upp en sträng med hjälp av ett skiljetecken. På så sätt kan vi plocka ut en viss del av en sträng och även dela upp en rad data på flera rader.



Grundfunktionen i både script och uttryck är att plocka ut en del av en sträng. Exempelvis om vi vill plocka ut "Äpple" från strängen "Banan|Päron|Äpple|Apelsin" i fältet Frukt kan vi skriva funktionen:


subfield(Frukt,'|',3)


Det vill säga - ta tredje delen av Frukt-strängen om vi delar upp den med hjälp av tecknet "|". Funktionen kan också ta den sista delen om antalet sammansatta delar är okänt:


subfield(Frukt,'|',-1)


En speciell användning av funktionen handlar om att i scriptet dela upp en rad i en tabell till flera rader. Om vi till exempel har tabellen enligt nedan kan vi dela upp varje order så att det blir en rad per order och frukt:








Load

OrderID,

Frukt,

subfield(Frukt,',') as FruktRad

from Fruktsallad.qvd (qvd);


Vi anger alltså i tredje parametern ingen siffra för vilken del vi vill ta ut. Detta skulle ge resultatet där varje Frukt-fält delat upp respektive rad till flera rader:











Detta kan ibland vara till nytta på speciella sätt. Anta att vi har följande tabell med perioder som projekt varit aktiva. Projektet med ID=2 var aktivit från och med 2016 till och med 2018. Men hur ska vi göra om vi istället vill ha varje år på en egen rad? Vi skulle kunna göra en intervalmatch() med en årstabell, men vi kan också utnyttja att subfield() delar upp rader på flera rader samt räkna från året.







Load

ProjectID,

FromYear,

ToYear,

subfield(repeat('|',ToYear-FromYear),'|') as RowSplit,

if(ProjectID=peek(ProjectID),peek(Year)+1,FromYear) as Year

from Project_Period.qvd (qvd);


Här utnyttjar vi att funktionen subfield kan dela upp en rad på flera rader genom att först sätta ihop så många "|"-tecken som det finns år mellan FromYear och ToYear. Sedan delar vi upp denna sträng med just "|"-tecknet och får då så många rader som det finns år mellan FromYear och ToYear.


I RowSplit-kolumnen kommer det bara bli tomma strängar eftersom vi inte skrivit något mellan "|"-tecknen.


För utträkningen Year-kolumnen kollar vi först om det är samma ProjectID som på föregående rad och i så fall tar vi föregående Year och lägger på 1. Är det ett nytt projektstartar vi om från FromYear.


Detta ger resultatet: