Capitalize(CustomerName)
Upper, Lower and Capitalize in Power BI
UPPER and LOWER exist in DAX and Power Query (Text.Upper, Text.Lower). Capitalize, which is proper case, only exists in Power Query as Text.Proper. DAX has no proper-case function. The bigger trap is case sensitivity: the Power BI model compares text case-insensitively, while Power Query is case-sensitive.
Short answer: Use Text.Proper([Name]) in Power Query for Capitalize. Normalise join keys with Text.Upper before merges. In the model, "abc" and "ABC" end up as one value anyway.
What it does in Qlik
Upper(text)andLower(text)change the case.Capitalize(text)uppercases the first letter of each word and lowercases the rest, soCapitalize('star trek')returns "Star Trek".
Qlik example
Capitalize(CustomerName) AS CustomerName,
Upper(Trim(CountryCode)) AS CountryCodePower BI equivalent
Power Query
= Table.TransformColumns(Src, {
{"CustomerName", Text.Proper, type text},
{"CountryCode", each Text.Upper(Text.Trim(_)), type text}})DAX
Country upper = UPPER ( T[CountryCode] )
// No PROPER() in DAX - do Capitalize in Power QueryGotchas and behaviour differences
- Case behaviour differs by layer. Qlik field values are case-sensitive, so "abc" and "ABC" are two values. In a Power BI semantic model, VertiPaq stores them as one value and shows whichever case it loaded first. Merges and
Text.Containsin Power Query are case-sensitive unless you passComparer.OrdinalIgnoreCase. Text.Properdoesn't know about names like "McDonald" or "van der Berg". Neither does Qlik's Capitalize, so expect the same output.
Official documentation
- Capitalize - script and chart function (Qlik Help)
- Upper - script and chart function (Qlik Help)
- Text.Proper (Power Query M) (Microsoft Learn)
- UPPER function (DAX) (Microsoft Learn)
Related pages
Match(Region, 'North', 'South')
Match, MixMatch and WildMatch
Match, MixMatch and WildMatch test a value against a list and return its position (or 0). They differ in case sensitivity and wildcard support, and so do DAX and Power Query, in the opposite direction from what you might expect.
Partial / different approach
Trim(Replace(Name, ' ', ' '))
Replace and Trim
Qlik Replace maps to DAX SUBSTITUTE, not DAX REPLACE, which is positional. Trim has a subtle difference. Qlik Trim and Power Query Text.Trim only remove leading and trailing spaces. DAX TRIM also collapses repeated spaces inside the text to one, so the results can differ.
Partial / different approach
ApplyMap('MapName', expr [, default])
Mapping Load and ApplyMap
ApplyMap looks up a value in a two-column mapping table during load. In Power BI, use a merge in Power Query, a record lookup, or simply a relationship with RELATED. The behaviour differs for case sensitivity, duplicates and missing keys.
Partial / different approach
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.