The associative engine is the part that genuinely has to change
QlikView's defining idea is that you do not declare joins. Load two tables that both contain a field called CustomerID and they associate, automatically, on that name. It is a fast way to get somewhere and a slow way to stay there: share two field names between the same pair of tables and QlikView quietly manufactures a synthetic key table to reconcile them; close a loop between three tables and it loosens one of them for you and tells you afterwards. Most QVW estates carry a few of each, tolerated for years because the numbers looked plausible.
Power BI will not let you do that, and this is the single biggest reason a QlikView migration is not the same job as any other. A model relationship in Power BI relates exactly one column to one column in a different table, with a cardinality and a cross-filter direction you declare on purpose; Microsoft's documentation on model relationships in Power BI Desktop (opens in new tab) is explicit that only one active filter propagation path may exist between two tables, and that ambiguous paths are an error rather than something the engine papers over. So the associative sprawl has to be resolved into fact and dimension tables built on star schema principles (opens in new tab) before a single visual is placed. That is slower than redrawing the sheets, and it is where the value of the project sits: it is the moment three definitions of “active customer” that nobody had noticed disagreeing finally get settled.
Load script to Power Query M, set analysis to DAX
A QlikView document is its own ETL tool. The script does the extract, the reshaping, the mapping and the incremental logic, all in sequence, all inside the file. Power BI splits that work: row-level shaping goes into the Power Query M formula language (opens in new tab), and aggregation logic goes into measures evaluated against the model. We walk the script statement by statement and decide which of the three destinations each step belongs to — M, the model, or upstream in the warehouse, which is frequently the right answer for a mapping table that has been rebuilt on every reload since 2014.
Expressions get the same treatment. Set analysis and DAX are close cousins in intent and nothing alike in form: sum({<Region={'West'}>} Sales) narrows what one aggregation sees, and CALCULATE (opens in new tab) — which Microsoft documents as evaluating an expression in a modified filter context — is the tool that does the equivalent job in Power BI. The mapping is rarely one line for one line. Aggr() usually becomes an iterator over a summarized table; dollar-sign variable expansion becomes a measure or a calculation group; Above() and Below() chart offsets become explicit time intelligence against a real date table, because Power BI has no notion of the row above in a chart. Each one is re-derived from the rule it encodes and confirmed with whoever owns the number, not transliterated by a converter that produces something which runs and answers a different question.
Where each QlikView artifact actually lands
Most QlikView estates decompose into the same handful of pieces. The table below is the mapping we work from; the inventory in your written scope is a filled-in version of it, document by document.
| QlikView artifact |
What it actually holds |
Where it lands in Power BI |
| .qvw document (or .qvf app) |
Load script, in-memory data model and every sheet, in one binary file |
Split three ways: Power Query queries, a semantic model, and a .pbix report whose pages replace the sheets |
| .qvd extract files |
Qlik's proprietary columnar staging layer, often the only surviving copy of a retired source |
Bypassed by re-pointing Power Query at the original database, or staged out to an open format where the source is gone |
| Load script (LOAD / SELECT / RESIDENT / CONCATENATE) |
Sequential ETL living inside the document rather than in a pipeline |
Power Query M queries, or promoted upstream into the warehouse or a scheduled data pipeline |
| MAPPING LOAD and ApplyMap() |
Lookup substitution applied row by row during reload |
A merge step in Power Query, or a proper dimension table plus a relationship where the lookup is really a hierarchy |
| Associative field naming |
Implicit joins wherever two tables share a field name |
Explicit one-column relationships with declared cardinality and cross-filter direction |
| Synthetic keys and loosened circular references |
Automatic reconciliation tables the engine created when the model was ambiguous |
Removed by design: a composite key column, a conformed dimension, or a bridge table chosen deliberately |
| Set analysis modifiers |
Per-aggregation overrides of the current selection |
DAX measures built on CALCULATE with explicit filter arguments and filter modifiers |
| Aggr(), Above(), Below(), RangeSum() |
Chart-level and virtual-grouping calculations with no model equivalent |
Iterators over summarized tables and time intelligence written against a real date dimension |
| Variables with dollar-sign expansion |
Reusable expression text substituted at evaluation time |
Named DAX measures, calculation groups, or Power Query parameters, depending on what the variable was for |
| Section Access |
Row-level data reduction enforced when the document reloads |
Row-level security roles with DAX filter expressions, enforced by the service at query time |
| QMC / Publisher reload tasks |
Scheduled reloads and document distribution |
Semantic model refresh schedules, plus an on-premises data gateway where sources stay behind your firewall |
| NPrinting output |
Pixel-perfect documents and scheduled report delivery |
Paginated reports for anything that must keep its printed shape; Power BI subscriptions for everything else |
| Green / white / gray selection states |
Visual feedback showing selected, associated and excluded values |
No direct equivalent — rebuilt as slicers with visible applied filters, cross-highlighting, and explicit measures where exclusion drives a decision |
Two rows in that table are the ones that decide a timeline. If the QVD layer can be bypassed because the underlying databases are still there, the project is mostly modeling and expression work. If the QVDs have quietly become the system of record for a source that was switched off years ago, staging them out is a real piece of scope and we price it as such rather than discovering it in week three.
Who this is for
It fits small and mid-size US organizations running a QlikView estate that has outlived the person who wrote it — often with a renewal date approaching, a Microsoft 365 tenant already paid for, and nobody left in-house who is comfortable opening the load script. It is scoped as one fixed-fee project with a stated end date, not a rolling program, and we are candid when a document is better retired than rebuilt.
If the incumbent is a different platform, a sibling page will fit you better. Our Tableau to Power BI migration service covers workbooks that carry their own calculation logic, where LODs and table calculations rather than set analysis are the translation problem. Our SSRS to Power BI migration service is the Microsoft-to-Microsoft case, where RDL definitions travel largely intact as paginated reports and the work sits in subscriptions and folder security. And our Crystal Reports to Power BI migration service deals with .rpt files, formula fields and subreports opened from a button inside an ERP. And our Cognos to Power BI migration service covers the estate where a Framework Manager package already holds the modeling layer and report bursting handles distribution. And our Domo to Power BI migration service covers the all-in-one SaaS case, where Beast Mode calculated fields and Magic ETL dataflows have to be rehoused at the same time as the cards, because Domo bundles storage and transformation with the reporting. And our SAP BusinessObjects to Power BI migration service covers the opposite extreme: a universe already centralizes the business definitions, so that estate is read as a specification rather than reverse-engineered from a script. And our MicroStrategy to Power BI migration service covers the MicroStrategy estate — the platform its vendor now brands as Strategy — where a project metadata repository already holds the attributes, facts and level metrics centrally, which is the exact opposite of a load script rewritten once inside every document. QlikView is its own animal because of the associative engine and the QVD layer — none of those seven pages has an equivalent problem to solve.
Once you have landed on Power BI, the work usually continues. Our fixed-fee Power BI dashboard development service covers reports built new on the model rather than migrated onto it, the guide to what a Power BI dashboard actually costs explains how scope drives a fixed fee, and if the scale of your estate eventually justifies it, our Power BI to Fabric migration service handles capacity. Where the load script was doing work that belonged in a pipeline, our Azure Data Factory pipeline development service builds the scheduled loads that replace it.
Delivery in three phases
Most QlikView estates sort cleanly into three phases. The table shows scope and typical timeline rather than prices, because an honest number requires reading your load scripts first — the same principle described on how our fixed-fee process works.
| Phase |
Scope |
Typical timeline |
Fee |
| Phase 1 — core model and headline documents |
The documents leadership and operations open weekly: star schema built from the load script, QVD dependencies resolved, headline set analysis expressions rewritten as DAX and reconciled, workspace and access configured |
About the first week |
Fixed fee — scoped after your free consultation |
| Phase 2 — departmental documents |
Finance, sales or operations sheets rebuilt as report pages on the shared model, with Section Access re-expressed as row-level security, drill-through in place of embedded detail, and a walkthrough per team |
Weeks 2–3 |
Fixed fee — scoped after your free consultation |
| Phase 3 — distribution, long tail and decommission |
NPrinting output rebuilt as paginated reports or subscriptions, refresh schedules and gateway configured, low-traffic documents rebuilt, consolidated or retired by agreement, plus the written list of reload tasks and licences you can cancel |
Week 4 and close-out |
Fixed fee — scoped after your free consultation |
Nothing is switched off early. Your QlikView documents keep reloading on their existing schedule while Power BI connects to the same sources alongside them, so both can sit on one screen while your team argues about the numbers before anyone commits. Everything produced is yours from the first day: the semantic model, the report files, every measure and query, and the workspace configuration all live in your own Microsoft tenant, never in ours.