Dynamic KPI creation
Data comes in all shapes and sizes and sometimes, the users of the data want to see this as a series of metrics eg as key performance indicators. As always, there are not of ways of handling this and for a quick way in Qlik Sense you can use some generic logic to build a KPI data set that you can keep expanding.
This example draws some sample definitions from an inline table and then builds a KPI fact table that could potentially draw data from a lot of different sources (Finance, Personnel, Sales, etc).
We have used it where we didn’t have the time, budget and/or support for building this at the database level.
// Sample script for creating a series of KPI values
// Sample definitions, these could be imported in from a spreadsheet or database table as a more flexible alternative
// Sample data referred to is created using the sample Qlik script (Ctrl + 00) in Qlik Sense
KPIDefinitions:
Load * Inline [
KPI Id, KPI Description, Numerator, Numerator Operator, Denominator, Denominator Operator, Filter, Format, Target, Target Comparison, Target Direction
KPI-1, Expression2 as % of Expression3 (Dim1=A or C), Expression3, Sum, Expression2, Sum, "Where Wildmatch(Dim1, 'A*', 'C*')","0.00%", 1, ">=", Above
KPI-2, Count of Dim1 (where Dim1=A), Dim1, Count, 1, , Where Dim1='A', "#,##0", 1000, "<", Below
KPI-3, Average of Expression3, Expression3, Avg, 1,,,"#,##0.00", 3.5, ">", Above
];
// Create the KPI records using the rules and the raw data
// Work out the number of iterations by counting the KPIs
Let vKPIs = FieldValueCount('KPI Id');
// Create each KPI from the Transactions table
For i = 1 to $(vKPIs)
vKPIId = Peek('KPI Id', $(i)-1, 'KPIDefinitions');
vKPIDesc = Peek('KPI Description', $(i)-1, 'KPIDefinitions');
vKPINum = Peek('Numerator', $(i)-1, 'KPIDefinitions');
vKPINumOp = Peek('Numerator Operator', $(i)-1, 'KPIDefinitions');
vKPIDen = Peek('Denominator', $(i)-1, 'KPIDefinitions');
vKPIDenOp = Peek('Denominator Operator', $(i)-1, 'KPIDefinitions');
vKPIFilter = Peek('Filter', $(i)-1, 'KPIDefinitions');
vKPIFormat = Peek('Format', $(i)-1, 'KPIDefinitions');
vKPITarget = Peek('Target', $(i)-1, 'KPIDefinitions');
vKPITargetComp = Peek('Target Comparison', $(i)-1, 'KPIDefinitions');
vKPITargetDir = Peek('Target Direction', $(i)-1, 'KPIDefinitions');
KPI:
Load
Dim1,
'$(vKPIId)' as [KPI Id],
'$(vKPIDesc)' as [KPI Description],
$(vKPINumOp)($(vKPINum)) as [KPI Numerator],
$(vKPIDenOp)($(vKPIDen)) as [KPI Denominator],
'$(vKPIFormat)' as [KPI Format],
$(vKPITarget) as [KPI Target],
'$(vKPITargetComp)' as [KPI Target Comparison],
'$(vKPITargetDir)' as [KPI Target Direction]
// the following are lines for debugging only so can remain commented unless there is an issue
//,$(vKPINumOp)($(vKPINum)) / $(vKPIDenOp)($(vKPIDen)) as [KPI Value]
//,'$(vKPIFilter)' as [KPI Filter]
//,'$(vKPIDenOp)($(vKPIDen))' as [KPI Denominator Function]
//,'$(vKPINumOp)($(vKPINum))' as [KPI Numerator Function]
Resident Transactions
$(vKPIFilter)
Group By Dim1;
Next
// Tidy up by removing definitions table
Drop Table KPIDefinitions;

