The importance of Only()
Only() returnerar ett värde om det bara finns ett möjligt värde i gruppen. Det värdet blir resultatet av aggregeringen. Som standard returnerar Qlik Sense Only() om ingen aggregeringsfunktion specificeras.
Om relationen mellan diagramdimensionen och parametern är av typen en-till-en, returnerar funktionen Only() det enda möjliga värdet. Om det finns flera värden returnerar den NULL. Till exempel returneras NULL vid en sökning efter den enda produkten med styckpris =12, om fler än en produkt har styckpriset 12.
Följande bilder visar skillnaden mellan relationstyperna en-till-en och en-till-flera:
Funktionen Only() är en aggregeringsfunktion. Den använder många poster som indata och returnerar ett enda värde, på ett liknande sätt som Sum() eller Count(). I princip använder Qlik Sense aggregeringar i alla beräkningar. Uttrycket i ett diagram, ett sorteringsuttryck, en textruta, en avancerad sökning och i en beräknad etikett är alla aggregeringar som inte kan beräknas utan att en aggregeringsfunktion används.
Men vad händer om användaren anger ett uttryck som inte innehåller någon explicit aggregeringsfunktion? Till exempel om Date har angivits som sorteringsuttryck? Eller om det finns en avancerad sökning efter kunder som har köpt öl och vin med uttrycket =[Product Type]='Beer and Wine'?
Det är här Only()-funktionen påverkar beräkningen. Om det inte finns någon explicit aggregeringsfunktion i uttrycket använder Qlik Sense Only()-funktionen implicit. I fallen ovan används Only(Date) som sorteringsuttryck och Only([Product Type])='Beer and Wine' används som sökkriterium.
Ibland returnerar det nya uttrycket ett resultat som användaren inte väntar sig. Båda exemplen ovan fungerar när det bara finns ett möjligt värde för Date eller Product Type, men inget av dem fungerar om det finns fler än ett värde.
Olika uttryck som använder Only()
Vi ska skapa fyra KPI:er med liknande uttryck. På så sätt kan vi jämföra hur användningen av nakna fältreferenser, eller placeringen av Only() på en annan plats i uttrycket, inverkar på urvalsresultatet.
Inne i appen, på Importance of Only()-arket , finns en filterruta med dimensionen Invoice Date.
Gör följande:
- Skapa en KPI.
- Klicka på Lägg till mått. Klicka på symbolen .
Uttrycksredigeraren öppnas. - Ange följande: Month([Invoice Date])
- Skapa ytterligare tre KPIs med måtten Month(Only([Invoice Date])), Month(Max([Invoice Date])) och Only(Month([Invoice Date])).
- Klicka på Tillämpa.
När du har en naken fältreferens infogas funktionen Only() på den lägsta nivån. Det innebär att de två första KPI:erna , Month([Invoice Date]) och Month(Only([Invoice Date])), tolkas likadant och alltid kommer att ge samma resultat.
Som du ser returnerar tre av de fyra KPI:erna NULL. Den fjärde KPI:n, Month(Max([Invoice Date])), returnerar redan ett värde fastän inget urval har gjorts.
När du skriver uttryck ska du alltid fråga dig vilken aggregering du vill använda, eller vilket värde du vill använda om det finns flera värden. Om du vill använda NULL för att representera flera värden kan du lämna uttrycket som det är. För tal vill du antagligen använda Sum(), Avg(), Min() eller Max() istället. För strängar kan det vara lämpligt att använda Only() eller MinString().
Gör följande:
- Sluta redigera arket.
- Välj ett datum i januari i filterrutan.
- Bekräfta urvalet genom att klicka på .
När ett enstaka urval görs returnerar alla KPI:erna rätt svar. Även om uttrycket innehåller en naken fältreferens, som uttrycket i Month([Invoice Date]), kan det returnera korrekt värde eftersom vi har gjort ett unikt urval.
Gör följande:
- Välj ett till datum i januari i filterrutan.
- Bekräfta urvalet genom att klicka på .
De två första KPI:erna returnerar NULL, och de andra två KPI:erna returnerar det korrekta värdet January. Specifikt returnerar fjärde KPI ett korrekt svar eftersom båda datumurvalen vi gjorde avser datum i januari.
Gör följande:
- Välj ett till datum i filterrutan, i en annan månad än januari.
- Bekräfta urvalet genom att klicka på .
När flera urval görs och datum i olika månader används, returnerar bara den tredje KPI:n ett värde. Den returnerar värdet för den högsta månaden i urvalet enligt uttrycket Month(Max([Invoice Date])). Eftersom Only() infogas automatiskt i uttryck med nakna fältreferenser kan du inte räkna med att den lägsta nivån alltid är rätt för ditt uttryck. Det är viktigt var Only() placeras.
Mer information finns i Only – diagramfunktion.