Concat(DISTINCT Product, ', ')
Concat (string aggregation) in Power BI
Concat() joins values into one string. DAX has CONCATENATEX and Power Query has Text.Combine. The sort order and the duplicate handling are different from Qlik's defaults.
Short answer: Concat(DISTINCT Product, ', ') becomes CONCATENATEX(VALUES(Product[Name]), Product[Name], ", ", Product[Name], ASC). Always pass the order-by argument.
What it does in Qlik
Concat([DISTINCT] string [, delimiter [, sort_weight]]) concatenates values over the records in scope. Without DISTINCT, duplicates are kept. When sort_weight is omitted, Qlik sorts the values alphanumerically.
Qlik example
// chart
Concat(DISTINCT Product, ', ')
Concat(DISTINCT Product, ', ', -Sales) // ordered by sales, high to low (sort_weight)
// script
LOAD OrderID, Concat(DISTINCT Product, ', ') AS Products
RESIDENT OrderLines GROUP BY OrderID;Power BI equivalent
DAX measure
Product list =
CONCATENATEX ( VALUES ( Product[Name] ), Product[Name], ", ", Product[Name], ASC )
Products by sales =
CONCATENATEX ( VALUES ( Product[Name] ), Product[Name], ", ", [Sales], DESC )Power Query (script equivalent)
= Table.Group(
OrderLines, {"OrderID"},
{{"Products", each Text.Combine(List.Sort(List.Distinct([Product])), ", "), type text}}
)Gotchas and behaviour differences
CONCATENATEXwithout an order-by argument has no guaranteed order. Qlik sorts alphanumerically by default.VALUES(...)already removes duplicates (theDISTINCTpart). To keep duplicates as Qlik does without DISTINCT, iterate the fact table:CONCATENATEX(Sales, RELATED(Product[Name]), ", ").- Qlik's alphanumeric sort and DAX's text sort can order mixed numbers and text, or accented characters, differently.
Text.Combineskips null values.
Official documentation
- Concat - chart function (Qlik Help)
- CONCATENATEX function (DAX) (Microsoft Learn)
- Text.Combine (Power Query M) (Microsoft Learn)
- CONCATENATEX (dax.guide)
Related pages
Only(Region)
Only
Only() returns a value when exactly one value is possible and null otherwise. In DAX that is SELECTEDVALUE, which also accepts an alternate result.
Direct equivalent
GetFieldSelections(Region)
GetFieldSelections and GetSelectedCount
GetFieldSelections returns the selected values of a field as text, often for dynamic titles. In DAX you combine ISFILTERED, VALUES and CONCATENATEX.
Partial / different approach
LOAD ..., Sum(x) RESIDENT t GROUP BY ...
Group By in the load script
GROUP BY in a Qlik load pre-aggregates a table. Power Query's Group by (Table.Group) is the direct equivalent. In Power BI you often don't need it at all, because measures aggregate at query time.
Direct equivalent
Spotted an error or a better pattern? QlikToDax is maintained by a working BI consultant; corrections are welcome via the About page. Last reviewed 2026-10-25.