<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sergei Semenkov</title>
    <description>The latest articles on DEV Community by Sergei Semenkov (@sergeisemenkov).</description>
    <link>https://dev.to/sergeisemenkov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F563580%2F53802125-95ee-4bc2-81c7-c45a8eb7fedb.jpg</url>
      <title>DEV Community: Sergei Semenkov</title>
      <link>https://dev.to/sergeisemenkov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sergeisemenkov"/>
    <language>en</language>
    <item>
      <title>The new eMondrian: Power BI and AI agents on your own semantic model</title>
      <dc:creator>Sergei Semenkov</dc:creator>
      <pubDate>Tue, 13 Oct 2026 07:34:31 +0000</pubDate>
      <link>https://dev.to/sergeisemenkov/the-new-emondrian-power-bi-and-ai-agents-on-your-own-semantic-model-4nap</link>
      <guid>https://dev.to/sergeisemenkov/the-new-emondrian-power-bi-and-ai-agents-on-your-own-semantic-model-4nap</guid>
      <description>&lt;p&gt;In 2021 I wrote here &lt;a href="https://dev.to/sergeisemenkov/how-to-load-data-from-mondrian-to-power-bi-desktop-50kb"&gt;how to load data from Mondrian into Power BI Desktop&lt;/a&gt;. The short version of that article was: a &lt;strong&gt;live connection isn't possible&lt;/strong&gt;, so you have to import data with an MDX query.&lt;/p&gt;

&lt;p&gt;That's no longer true. eMondrian now connects to Power BI live — and to AI agents too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Power BI&lt;/strong&gt; connects live to eMondrian through the DAX module — no data import, no SSAS. Your data stays in ClickHouse or your SQL database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI agents&lt;/strong&gt; connect through MCP — they list catalogs, read the semantic model, run queries and can even draft new cubes for you.&lt;/li&gt;
&lt;li&gt;One semantic model, defined once, serves &lt;strong&gt;Excel, Power BI and AI agents&lt;/strong&gt; with the same measures and the same numbers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can try all three on the &lt;a href="https://emondrian.com/demo?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch" rel="noopener noreferrer"&gt;public demo&lt;/a&gt; in two minutes, or &lt;a href="https://emondrian.com/get-started?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch" rel="noopener noreferrer"&gt;install Community&lt;/a&gt; and evaluate DAX and MCP for 30 days with a free key.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foxwqjes6mvtbdp6jd2jt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foxwqjes6mvtbdp6jd2jt.png" alt="Excel, Power BI and AI agents connect to one eMondrian semantic model, which queries ClickHouse, PostgreSQL or another JDBC database" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;eMondrian is built on &lt;a href="https://en.wikipedia.org/wiki/Mondrian_OLAP_server" rel="noopener noreferrer"&gt;Mondrian&lt;/a&gt;, the open-source OLAP engine. You describe your business model once — cubes, dimensions, hierarchies, measures like &lt;em&gt;Revenue&lt;/em&gt; or &lt;em&gt;On-Time Rate&lt;/em&gt; — and eMondrian turns every question into SQL against your database.&lt;/p&gt;

&lt;p&gt;Excel has always worked well with this: PivotTables speak &lt;strong&gt;MDX&lt;/strong&gt; over &lt;strong&gt;XMLA&lt;/strong&gt;, the same protocol Microsoft Analysis Services uses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Power BI was the missing piece.&lt;/strong&gt; When Power BI connects live to an Analysis Services–style server, it doesn't send MDX — it sends &lt;strong&gt;DAX&lt;/strong&gt;. Classic Mondrian doesn't understand DAX, so Power BI couldn't use Mondrian cubes live. Teams imported data into Power BI and re-created every measure there — exactly the duplication a semantic layer is supposed to remove.&lt;/p&gt;

&lt;p&gt;At the same time a new kind of client appeared: &lt;strong&gt;AI agents&lt;/strong&gt;. Pointed at raw tables, an agent has to guess joins and formulas, and two agents (or an agent and a report) easily disagree on what "revenue" means. Pointed at a semantic model, the agent uses the definitions your business already agreed on.&lt;/p&gt;

&lt;p&gt;The new eMondrian addresses both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Power BI: live connection through the DAX module
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What you get&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In Power BI Desktop: &lt;strong&gt;Get data → Analysis Services&lt;/strong&gt;, server &lt;code&gt;http://&amp;lt;your-server&amp;gt;/xmla&lt;/code&gt;, &lt;strong&gt;Connect live&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Your cubes appear as a Power BI semantic model: measures, dimensions and hierarchies, ready to drag into visuals.&lt;/li&gt;
&lt;li&gt;Every visual sends a DAX query to eMondrian; eMondrian evaluates it against the model and sends SQL to your database. Nothing is imported into Power BI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frud9ms0dfz00r65kq31u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frud9ms0dfz00r65kq31u.png" alt="A Power BI visual sends DAX over XMLA to the eMondrian DAX module, which maps it to the cube model; the engine sends SQL to ClickHouse" width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The DAX module evaluates the queries Power BI sends on the same engine that serves MDX — so a measure defined once in the schema gives the same result in Excel and in Power BI.&lt;/p&gt;

&lt;p&gt;You can see exactly what Power BI sends: in Power BI Desktop open &lt;strong&gt;Performance analyzer&lt;/strong&gt;, refresh a visual and copy its DAX query. A simple example on the FoodMart sample:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EVALUATE ROW("Org_Salary", 'HR'[Org Salary])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why a live connection instead of import or DirectQuery&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No duplicated business logic.&lt;/strong&gt; Measures live in one place — the eMondrian schema — not in every Power BI file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No data copies.&lt;/strong&gt; Data stays in your database; there's no import refresh to schedule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same numbers in Excel and Power BI.&lt;/strong&gt; Both clients query the same model.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note on Microsoft support.&lt;/strong&gt; Power BI connects to eMondrian through its Analysis Services connector. Microsoft officially supports only a few third-party semantic models, and eMondrian is not one of them. Microsoft support won't help with this setup — eMondrian Enterprise does.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  AI agents through MCP
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; — the Model Context Protocol — is the standard way AI agents such as Claude connect to tools and data. eMondrian now includes an MCP server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc3zry782w3o18s6w39f6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc3zry782w3o18s6w39f6.png" alt="An AI agent talks MCP to eMondrian's tools — list_catalogs, get_schema, execute_query, the authoring guide, validate_schema, save_schema — which query the semantic model" width="799" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What the agent can do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_catalogs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;See which catalogs (semantic models) exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_schema&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Read a model: cubes, dimensions, measures and their definitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;execute_query&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run MDX or DAX against a catalog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_cube_authoring_guide&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Learn how to write eMondrian schemas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;validate_schema&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check a schema for problems before using it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;save_schema&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Save a new or updated schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;save_catalog&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Register a new catalog and write its schema file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;read_logs&lt;/code&gt;, &lt;code&gt;get_properties&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Inspect server logs and settings when something goes wrong&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Ask questions in business terms.&lt;/strong&gt; Connect Claude Code in one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; sse emondrian http://localhost/emondrian/mcp/sse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Compare the cancellation rate of American Airlines and Delta in January 2022 and explain the difference.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent reads the OnTime model, finds the &lt;em&gt;Cancellation Rate&lt;/em&gt; measure — already defined as &lt;code&gt;Cancelled / Flights&lt;/code&gt; — writes the MDX, runs it on ClickHouse through eMondrian and explains the answer. It doesn't invent its own formula, so its numbers match your Excel and Power BI reports.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let the agent build your first cube
&lt;/h3&gt;

&lt;p&gt;This is the part I'm most excited about. Describing the first cube has always been the hardest step of an eMondrian evaluation. With MCP, an agent can do most of it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;In catalog MySales, create a cube Sales on the ClickHouse table &lt;code&gt;sales&lt;/code&gt; (sale_date, region, product, quantity, amount). Add a Time dimension from sale_date, Region and Product dimensions, measures Amount and Quantity, and Avg Price = Amount / Quantity. Follow the cube authoring guide, validate the schema, then save it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4i942wfzaif63ohy7kab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4i942wfzaif63ohy7kab.png" alt="The agent reads the authoring guide, drafts the schema, validates it, saves it to the catalog, and the cube opens in Excel or Power BI" width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One model, three clients
&lt;/h2&gt;

&lt;p&gt;The real point isn't Power BI or MCP on their own. It's that &lt;strong&gt;one semantic model now serves all three kinds of clients&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F77srfhnf1pbawxuvimor.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F77srfhnf1pbawxuvimor.png" alt="The On-Time Rate measure is defined once in the schema and gives the same number in Excel, Power BI and an AI agent" width="799" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Excel&lt;/th&gt;
&lt;th&gt;Power BI&lt;/th&gt;
&lt;th&gt;AI agents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;XMLA / MDX&lt;/td&gt;
&lt;td&gt;XMLA / DAX&lt;/td&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical use&lt;/td&gt;
&lt;td&gt;PivotTables, ad-hoc analysis&lt;/td&gt;
&lt;td&gt;Dashboards, reports&lt;/td&gt;
&lt;td&gt;Questions in plain language, schema authoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Measures come from&lt;/td&gt;
&lt;td&gt;the eMondrian schema&lt;/td&gt;
&lt;td&gt;the eMondrian schema&lt;/td&gt;
&lt;td&gt;the eMondrian schema&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Define &lt;em&gt;Revenue&lt;/em&gt; once. Finance sees it in Excel, management in Power BI, and the AI assistant uses the same definition when someone asks "how did revenue develop last quarter?".&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ql0ni82tynhnxx9xd55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ql0ni82tynhnxx9xd55.png" alt="Four steps: public demo, Community on your machine, your own data, production" width="800" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Public demo — two minutes, nothing to install.&lt;/strong&gt;&lt;br&gt;
Connect Excel or Power BI to &lt;code&gt;https://demo.emondrian.com/xmla&lt;/code&gt; and explore the FoodMart and OnTime (ClickHouse) samples. &lt;a href="https://emondrian.com/demo?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch" rel="noopener noreferrer"&gt;Demo guide →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI agents can use the demo too, in read-only mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; sse emondrian-demo https://demo.emondrian.com/emondrian/mcp/sse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Community on your machine — about 15 minutes.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/eMondrian/emondrian-community.git
&lt;span class="nb"&gt;cd &lt;/span&gt;emondrian-community
./setup.sh          &lt;span class="c"&gt;# Windows: powershell -ExecutionPolicy Bypass -File .\windows-setup.ps1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Excel works right away. For Power BI and AI agents, request a free &lt;strong&gt;30-day evaluation key&lt;/strong&gt; — one key unlocks both DAX and MCP. &lt;a href="https://docs.emondrian.com/getting-started/quickstart" rel="noopener noreferrer"&gt;Quickstart →&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Your own data.&lt;/strong&gt;&lt;br&gt;
Connect your ClickHouse (or other JDBC) database, describe a cube — by hand or with an agent — and point your real Power BI reports at it. Need more than 30 days? &lt;a href="https://emondrian.com/license?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch#extend" rel="noopener noreferrer"&gt;Ask for an extension&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licensing at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Community&lt;/th&gt;
&lt;th&gt;Commercial License&lt;/th&gt;
&lt;th&gt;Enterprise&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Engine, XMLA, MDX, Excel&lt;/td&gt;
&lt;td&gt;✓ free, EPL-1.0&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DAX module (Power BI)&lt;/td&gt;
&lt;td&gt;30-day evaluation&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP module (AI agents)&lt;/td&gt;
&lt;td&gt;30-day evaluation&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;GitHub issues&lt;/td&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Priority, help with your DAX reports&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;€4,900 per server / year&lt;/td&gt;
&lt;td&gt;On request&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The engine is open source under EPL-1.0. The DAX and MCP modules ship with Community and are unlocked by a license key. &lt;a href="https://emondrian.com/pricing?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch" rel="noopener noreferrer"&gt;Pricing →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What to expect — honestly
&lt;/h2&gt;

&lt;p&gt;We're a small team, so I'd rather be clear about the current limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DAX support for Power BI is in beta.&lt;/strong&gt; Test your own reports during the evaluation and send us the queries that fail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not officially supported by Microsoft.&lt;/strong&gt; See the note above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP in Community is for local use.&lt;/strong&gt; The MCP endpoint has no authentication and includes tools that can change schemas and register catalogs. Keep it on &lt;code&gt;localhost&lt;/code&gt; or a trusted network. Authentication, per-user access and an audit log of agent queries are planned for Enterprise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support hours.&lt;/strong&gt; Business days, UTC+4. No 24/7.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More in &lt;a href="https://emondrian.com/what-to-expect?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch" rel="noopener noreferrer"&gt;What to expect&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://emondrian.com/demo?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch" rel="noopener noreferrer"&gt;Demo&lt;/a&gt; · &lt;a href="https://docs.emondrian.com/getting-started/quickstart" rel="noopener noreferrer"&gt;Quickstart&lt;/a&gt; · &lt;a href="https://github.com/eMondrian/emondrian-community" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://emondrian.com/license?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=launch" rel="noopener noreferrer"&gt;Get an evaluation key&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions or a failing DAX query? Leave a comment here, &lt;a href="https://github.com/eMondrian/emondrian-community/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt; or write to &lt;a href="mailto:contact@bisolutions.dev"&gt;contact@bisolutions.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;eMondrian is developed and supported by &lt;a href="https://bisolutions.dev/" rel="noopener noreferrer"&gt;BIS — Business Intelligence Solutions&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>clickhouse</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
    <item>
      <title>Planning in Excel with Writeback</title>
      <dc:creator>Sergei Semenkov</dc:creator>
      <pubDate>Mon, 05 Sep 2022 18:26:30 +0000</pubDate>
      <link>https://dev.to/sergeisemenkov/planning-in-excel-with-writeback-58gc</link>
      <guid>https://dev.to/sergeisemenkov/planning-in-excel-with-writeback-58gc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update 2026:&lt;/strong&gt; eMondrian has a new home — &lt;a href="https://emondrian.com" rel="noopener noreferrer"&gt;emondrian.com&lt;/a&gt;, docs at &lt;a href="https://docs.emondrian.com" rel="noopener noreferrer"&gt;docs.emondrian.com&lt;/a&gt;, code at &lt;a href="https://github.com/eMondrian/emondrian-community" rel="noopener noreferrer"&gt;github.com/eMondrian/emondrian-community&lt;/a&gt;. What's new: &lt;a href="https://dev.to/sergeisemenkov/the-new-emondrian-power-bi-and-ai-agents-on-your-own-semantic-model-4nap"&gt;The new eMondrian&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Check our newest video on how &lt;a href="https://sergeisemenkov.github.io/eMondrian/" rel="noopener noreferrer"&gt;eMondrian&lt;/a&gt; can support you to decentralize your planning and forecasting activities for your organization.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/kmpBqEFKZWA" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Our example from today is a beverages company which operates in many different regions and has plenty of stores. We are going to quickly show you how you could outsource the initial planning for the sales per product to the store managers.&lt;/p&gt;

&lt;p&gt;This video was created by &lt;a href="https://www.linkedin.com/in/leandro-aeschlimann/" rel="noopener noreferrer"&gt;Leandro Aeschlimann&lt;/a&gt;. His company &lt;a href="https://www.linkedin.com/company/consenso-solutions/" rel="noopener noreferrer"&gt;Consenso&lt;/a&gt; specialises in implementing data analytics tools and data infrastructure.&lt;/p&gt;

&lt;p&gt;eMondrian  is a free and open source alternative to Analysis Services from Microsoft which you can install on Linux and Windows.&lt;br&gt;
It allows you to build cubes and consolidate the tables of you underlying data sources to a data model and connect to it from various client tools to visualize &amp;amp; analyse your data in a more user friendly way.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>management</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Welcome to the free open-source OLAP server project</title>
      <dc:creator>Sergei Semenkov</dc:creator>
      <pubDate>Mon, 15 Nov 2021 13:59:06 +0000</pubDate>
      <link>https://dev.to/sergeisemenkov/welcome-to-the-free-open-source-olap-server-project-132f</link>
      <guid>https://dev.to/sergeisemenkov/welcome-to-the-free-open-source-olap-server-project-132f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update 2026:&lt;/strong&gt; eMondrian has a new home — &lt;a href="https://emondrian.com" rel="noopener noreferrer"&gt;emondrian.com&lt;/a&gt;, docs at &lt;a href="https://docs.emondrian.com" rel="noopener noreferrer"&gt;docs.emondrian.com&lt;/a&gt;, code at &lt;a href="https://github.com/eMondrian/emondrian-community" rel="noopener noreferrer"&gt;github.com/eMondrian/emondrian-community&lt;/a&gt;. What's new: &lt;a href="https://dev.to/sergeisemenkov/the-new-emondrian-power-bi-and-ai-agents-on-your-own-semantic-model-4nap"&gt;The new eMondrian&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Welcome to the site of the &lt;a href="https://sergeisemenkov.github.io/eMondrian" rel="noopener noreferrer"&gt;&lt;strong&gt;eMondrian&lt;/strong&gt;&lt;/a&gt; project.&lt;/p&gt;

&lt;p&gt;eMondrian is a free open-source &lt;a href="https://en.wikipedia.org/wiki/Online_analytical_processing" rel="noopener noreferrer"&gt;OLAP&lt;/a&gt; server. It is based on the &lt;a href="https://github.com/pentaho/mondrian" rel="noopener noreferrer"&gt;Mondrian&lt;/a&gt; project. OLAP server allows you to represent your database as a multidimensional space with dimensions and measures. It hides the complexity of underlying tables and their relations and allows you to interactively analyze data from multiple perspectives. eMondrian server can run on Windows and Linux operating systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj34edhvspxe64fjrw52k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj34edhvspxe64fjrw52k.png" alt=" " width="799" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;eMondrian supports XML for Analysis (XMLA) standard and OLE DB for OLAP at the level that makes it possible to connect to it from client tools such as Microsoft Excel, Power BI, Tableau and many others. The logic of the original Mondrian was changed in order to improve performance of queries specific to these clients and to support clients’ features, for example Excel’s sessions, calculated members and sets.&lt;/p&gt;

&lt;p&gt;Any database that has a &lt;a href="https://en.wikipedia.org/wiki/JDBC_driver" rel="noopener noreferrer"&gt;JDBC&lt;/a&gt; driver can be the source for eMondrian. eMondrian server is a Relational OLAP (ROLAP) server that means it always shows real time data from a source. This server runs queries written in the MDX language, reads data from a source database and presents results in a multidimensional format.&lt;/p&gt;

&lt;p&gt;The most efficient way is to use &lt;a href="https://en.wikipedia.org/wiki/Column-oriented_DBMS" rel="noopener noreferrer"&gt;column store databases&lt;/a&gt; as data sources for eMondrian. For example, &lt;a href="https://clickhouse.com/" rel="noopener noreferrer"&gt;ClickHouse&lt;/a&gt; could run as a powerful and fast query engine while eMondrian works as a proxy representing data as cubes and executing MDX queries. &lt;/p&gt;

</description>
      <category>analytics</category>
      <category>backend</category>
      <category>database</category>
      <category>opensource</category>
    </item>
    <item>
      <title>A simple way to import data to Power BI from Mondrian</title>
      <dc:creator>Sergei Semenkov</dc:creator>
      <pubDate>Sun, 01 Aug 2021 16:22:05 +0000</pubDate>
      <link>https://dev.to/sergeisemenkov/a-simple-way-to-import-data-to-power-bi-from-mondrian-52b1</link>
      <guid>https://dev.to/sergeisemenkov/a-simple-way-to-import-data-to-power-bi-from-mondrian-52b1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update 2026:&lt;/strong&gt; besides importing with MDX, Power BI can now connect to eMondrian &lt;strong&gt;live&lt;/strong&gt;. See &lt;a href="https://dev.to/sergeisemenkov/the-new-emondrian-power-bi-and-ai-agents-on-your-own-semantic-model-4nap"&gt;The new eMondrian: Power BI and AI agents on your own semantic model&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the &lt;a href="https://dev.to/sergeisemenkov/how-to-load-data-from-mondrian-to-power-bi-desktop-50kb"&gt;previous article&lt;/a&gt; I described how to import data to Power BI using MDX query. A new version of &lt;a href="https://github.com/SergeiSemenkov/eMondrian" rel="noopener noreferrer"&gt;eMondrain&lt;/a&gt; allows you to load data from Mondrian without any query, using only Power BI designer. eMondrain is a version of Mondrian that is modified to support Excel and some other applications as clients.&lt;/p&gt;

&lt;p&gt;As an example, we will load data from the Mondrian sample database Foodmart.&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://powerbi.microsoft.com/en-us/desktop/" rel="noopener noreferrer"&gt;Power BI Desktop&lt;/a&gt; application we create a new report and select the menu &lt;strong&gt;Get data&lt;/strong&gt; - &lt;strong&gt;Analysis Services&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecnz19o03ha2u4ik373k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecnz19o03ha2u4ik373k.png" alt="Alt Text" width="754" height="575"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;SQL Server Analysis Services database&lt;/strong&gt; dialog we fill in the &lt;strong&gt;Server&lt;/strong&gt; field as a connection string to the Mondrian server. Pick the &lt;strong&gt;Import&lt;/strong&gt; radio button and push the &lt;strong&gt;Ok&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;To try this example you can use an online eMondrian server with a sample database. The server address is &lt;em&gt;&lt;a href="https://ssemenkoff.dev/emondrian/xmla" rel="noopener noreferrer"&gt;https://ssemenkoff.dev/emondrian/xmla&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fddwbgta4ggsy23tlfkvt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fddwbgta4ggsy23tlfkvt.png" width="704" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Navigator&lt;/strong&gt; window will appear. There you have to pick up columns that you want to see in your report. While you are choosing columns you will see a data preview on the right side of the window. As you finish push the &lt;strong&gt;Load&lt;/strong&gt; button. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fom894p54k8cxr5b3n3ks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fom894p54k8cxr5b3n3ks.png" width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Data will be loaded to our report and available columns will appear on the right side of the application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdmo9cpzthazaszbwqog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjdmo9cpzthazaszbwqog.png" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This way of loading data from Mondrian OLAP server to Power BI is very simple and doesn’t need any knowledge of a query language.&lt;/p&gt;

&lt;p&gt;If you have any questions or suggestions, feel free to contact me at &lt;a href="mailto:siarhei.semiankou@gmail.com"&gt;siarhei.semiankou@gmail.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>mondrian</category>
      <category>emondrian</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to load data from Mondrian to Power BI Desktop</title>
      <dc:creator>Sergei Semenkov</dc:creator>
      <pubDate>Fri, 05 Mar 2021 10:22:52 +0000</pubDate>
      <link>https://dev.to/sergeisemenkov/how-to-load-data-from-mondrian-to-power-bi-desktop-50kb</link>
      <guid>https://dev.to/sergeisemenkov/how-to-load-data-from-mondrian-to-power-bi-desktop-50kb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update 2026:&lt;/strong&gt; Power BI can now connect to eMondrian &lt;strong&gt;live&lt;/strong&gt; — no MDX import needed. eMondrian answers the DAX queries Power BI sends, and AI agents can use the same model over MCP. See &lt;a href="https://dev.to/sergeisemenkov/the-new-emondrian-power-bi-and-ai-agents-on-your-own-semantic-model-4nap"&gt;The new eMondrian: Power BI and AI agents on your own semantic model&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;However it’s impossible to explore &lt;a href="https://en.wikipedia.org/wiki/Mondrian_OLAP_server" rel="noopener noreferrer"&gt;Mondrian&lt;/a&gt; cubes in &lt;a href="https://powerbi.microsoft.com/en-us/desktop/" rel="noopener noreferrer"&gt;Power BI Desktop&lt;/a&gt; through live connection, there is a way how you can load data from Mondrian by queries.&lt;/p&gt;

&lt;p&gt;Let’s load data from the Mondrian sample database Foodmart and create a simple interactive report. This example is using the &lt;a href="https://github.com/SergeiSemenkov/eMondrian" rel="noopener noreferrer"&gt;eMondrain&lt;/a&gt; version of Mondrian that is modified to support Excel and some other applications as clients.&lt;/p&gt;

&lt;p&gt;First we have to design a &lt;a href="https://en.wikipedia.org/wiki/MultiDimensional_eXpressions" rel="noopener noreferrer"&gt;MDX&lt;/a&gt; query. Following query gets sales amount data with dates and store information.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT
[Measures].[Store Sales] on COLUMNS,
CrossJoin( [Time].[Month].Members, [Store].[Store Name].Members ) on ROWS
FROM [Sales]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mondrian server can return data in two formats. First format is CellSet data format which is convenient in case of using client controls like Pivot Table.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdphu9ul4umvs6mh29mtr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdphu9ul4umvs6mh29mtr.png" width="612" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second format is tabular format. It’s a simple table and is convenient when you are designing a report with tables and charts. This format is used by Power Bi when it loads data from Mondrian.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1xcm769spbee5jol802.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1xcm769spbee5jol802.png" alt="Alt Text" width="659" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Power BI Desktop application we create a new report and select the menu &lt;strong&gt;Get data&lt;/strong&gt; - &lt;strong&gt;Analysis Services&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsc1qvegtslwjpe9qlexx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsc1qvegtslwjpe9qlexx.png" width="799" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;SQL Server Analysis Services database&lt;/strong&gt; dialog we fill in the &lt;strong&gt;Server&lt;/strong&gt; field as a connection string to the Mondrian server. Fill in database name in field &lt;strong&gt;Database&lt;/strong&gt;. &lt;strong&gt;Database&lt;/strong&gt; is a required field and is case sensitive (in our case it's &lt;em&gt;FoodMart&lt;/em&gt;). Pick the &lt;strong&gt;Import&lt;/strong&gt; radio button. In the &lt;strong&gt;MDX or DAX query (optional)&lt;/strong&gt; field copy our MDX query and push the &lt;strong&gt;Ok&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;To try this example you can use an online eMondrian server with a sample database. The server address is &lt;em&gt;&lt;a href="https://ssemenkoff.dev/emondrian/xmla" rel="noopener noreferrer"&gt;https://ssemenkoff.dev/emondrian/xmla&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sat1yl3uzjvkg3sqgza.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sat1yl3uzjvkg3sqgza.png" width="705" height="513"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Preview window will appear where you can see part of the query result data in tabular format. Click the &lt;strong&gt;Load&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02fz79g6ag6inadfdj6x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02fz79g6ag6inadfdj6x.png" width="713" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to the &lt;strong&gt;Data&lt;/strong&gt; tab, rename columns and change &lt;em&gt;Sales&lt;/em&gt; column data type from &lt;em&gt;Text&lt;/em&gt; to &lt;em&gt;Decimal number&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvowlbfhcle5vg1g9jltu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvowlbfhcle5vg1g9jltu.png" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s return to the &lt;strong&gt;Report&lt;/strong&gt; tab and add some visualizations. In this example we use &lt;em&gt;Slicer&lt;/em&gt;, &lt;em&gt;Pie chart&lt;/em&gt; and &lt;em&gt;Table&lt;/em&gt; controls.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7t5ke9if4k73dpafq1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq7t5ke9if4k73dpafq1f.png" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To refresh your report and load newly added data you can always use the &lt;strong&gt;Refresh&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;As you see, you can add to your Power BI Desktop reports new ones which use data from the Mondrian OLAP server.&lt;/p&gt;

&lt;p&gt;If you have any questions or suggestions, feel free to contact me at &lt;a href="mailto:siarhei.semiankou@gmail.com"&gt;siarhei.semiankou@gmail.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>powerbi</category>
      <category>mondrian</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to explore ClickHouse data via Excel PivotTable using Mondrian</title>
      <dc:creator>Sergei Semenkov</dc:creator>
      <pubDate>Wed, 20 Jan 2021 12:39:26 +0000</pubDate>
      <link>https://dev.to/sergeisemenkov/how-to-explore-clickhouse-data-via-excel-pivottable-using-mondrian-4o46</link>
      <guid>https://dev.to/sergeisemenkov/how-to-explore-clickhouse-data-via-excel-pivottable-using-mondrian-4o46</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update 2026:&lt;/strong&gt; eMondrian now runs with Docker in one command and also works with Power BI and AI agents. Current setup: &lt;a href="https://docs.emondrian.com/getting-started/quickstart" rel="noopener noreferrer"&gt;Quickstart&lt;/a&gt; · What's new: &lt;a href="https://dev.to/sergeisemenkov/the-new-emondrian-power-bi-and-ai-agents-on-your-own-semantic-model-4nap"&gt;The new eMondrian&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;ClickHouse is a very powerful OLAP engine. Microsoft Excel is one of the world's most popular and powerful business programs. There are several ways to bring ClickHouse data to Excel spreadsheets.&lt;/p&gt;

&lt;p&gt;One way to do this is using ClickHouse ODBC driver. In order to do this you have to install the ODBC driver and create ClickHouse data source in Excel. Then you can explore data as tables or you can run a query on ClickHouse and browse results.&lt;/p&gt;

&lt;p&gt;The other way to explore ClickHouse data in Excel is using Mondrian. This approach allows you to describe ClickHouse data as a multidimensional model and give access to this model through XMLA standart. It also allows client applications to run MDX queries on ClickHouse data. You represent ClickHouse data as cubes and dimensions and then browse those cubes in Excel PivotTable.&lt;/p&gt;

&lt;p&gt;This article describes how to install Mondrian, create a Mondrian datasource for ClickHouse database and connect Excel PivotTable to this datasource.&lt;/p&gt;

&lt;p&gt;We will use the &lt;a href="https://github.com/SergeiSemenkov/eMondrian" rel="noopener noreferrer"&gt;eMondrian&lt;/a&gt; fork of the Mondrian ROLAP engine. The main feature of this version is support of ADOMD.NET and Excel clients. eMondrian already includes ClickHouse driver.&lt;/p&gt;

&lt;p&gt;Mondrian can be hosted on different java servers (Apache Tomcat, Jetty, Tiny Java Web Server). This example describes the case with Ubuntu operating system and Apache Tomcat java server.&lt;/p&gt;

&lt;p&gt;In this example Tomcat is installed in &lt;code&gt;/opt/tomcat/latest/&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;You have to change the following command to your Tomcat path.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;TOMCATDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/opt/tomcat/latest"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next commands download the Mondrian archive, copy it to Tomcat directory and restart Tomcat java server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;wget https://github.com/SergeiSemenkov/eMondrian/releases/latest/download/emondrian.war
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;emondrian.war &lt;span class="nv"&gt;$TOMCATDIR&lt;/span&gt;/webapps
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart tomcat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let's connect Excel to the Mondrian demo Foodmart database.&lt;/p&gt;

&lt;p&gt;In order to get address to your Mondrian XMLA service you have to insert your Ubuntu server ip in following template&lt;br&gt;
&lt;code&gt;http://&amp;lt;your_server_address&amp;gt;:8080/emondrian/xmla&lt;/code&gt;&lt;br&gt;
To get your server ip,  run command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;hostname&lt;/span&gt; &lt;span class="nt"&gt;-I&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example Mondrian server address is&lt;br&gt;
&lt;code&gt;http://192.168.100.4:8080/emondrian/xmla&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Open &lt;strong&gt;Excel&lt;/strong&gt;, select the &lt;strong&gt;Data&lt;/strong&gt; tab, then &lt;strong&gt;Get Data&lt;/strong&gt; -&amp;gt; &lt;strong&gt;From Database&lt;/strong&gt; -&amp;gt; &lt;strong&gt;From Analysis Services&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fecmtmq5d6jbzw66lbql9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fecmtmq5d6jbzw66lbql9.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste address of Mondrian XMLA service as Server name and click Next. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqji4ttmgxzxsbokutspx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqji4ttmgxzxsbokutspx.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then choose a cube and click Finish. The PivotTable with cube data will appear.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8jx2ehbj54ro99b9lzno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8jx2ehbj54ro99b9lzno.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we will create a Mondrian schema for ClickHouse example dataset &lt;a href="https://clickhouse.tech/docs/en/getting-started/example-datasets/ontime/" rel="noopener noreferrer"&gt;OnTime&lt;/a&gt;. The schema defines two cubes. Cube OnTime is based on data from ontime table. Cube ViewOnTime is an example of how to create a cube based on a query instead of a table.&lt;/p&gt;

&lt;p&gt;Following command will create new schema file OnTime.xml.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano &lt;span class="nv"&gt;$TOMCATDIR&lt;/span&gt;/webapps/emondrian/WEB-INF/schema/OnTime.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy xml to this file and press &lt;em&gt;Ctrl-S&lt;/em&gt; (Save) and &lt;em&gt;Ctrl-X&lt;/em&gt;(Exit).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Schema&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"OnTime"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Cube&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"OnTime"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Table&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"ontime"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Dimension&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Date"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Hierarchy&lt;/span&gt; &lt;span class="na"&gt;hasAll=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;allMemberName=&lt;/span&gt;&lt;span class="s"&gt;"All Dates"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Level&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Year"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"Year"&lt;/span&gt; &lt;span class="na"&gt;uniqueMembers=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"Numeric"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Level&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Quarter"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"Quarter"&lt;/span&gt; &lt;span class="na"&gt;uniqueMembers=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"Numeric"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;CaptionExpression&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;SQL&lt;/span&gt; &lt;span class="na"&gt;dialect=&lt;/span&gt;&lt;span class="s"&gt;"generic"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;concat(toString(Quarter), ' ', toString(Year))&lt;span class="nt"&gt;&amp;lt;/SQL&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/CaptionExpression&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/Level&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Level&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Month"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"Month"&lt;/span&gt; &lt;span class="na"&gt;uniqueMembers=&lt;/span&gt;&lt;span class="s"&gt;"false"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"Numeric"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;CaptionExpression&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;SQL&lt;/span&gt; &lt;span class="na"&gt;dialect=&lt;/span&gt;&lt;span class="s"&gt;"generic"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            concat(          
            CASE toString(Month) WHEN '1' THEN 'January'
            WHEN '2' THEN 'February'
            WHEN '3' THEN 'March'
            WHEN '4' THEN 'April'
            WHEN '5' THEN 'May'
            WHEN '6' THEN 'June'
            WHEN '7' THEN 'July'
            WHEN '8' THEN 'August'
            WHEN '9' THEN 'September'
            WHEN '10' THEN 'October'
            WHEN '11' THEN 'November'
            WHEN '12' THEN 'December'
            ELSE 'Unknown' END,
            ' ',
            toString(Year))
          &lt;span class="nt"&gt;&amp;lt;/SQL&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/CaptionExpression&amp;gt;&lt;/span&gt; 
      &lt;span class="nt"&gt;&amp;lt;/Level&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Level&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Day"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"FlightDate"&lt;/span&gt; &lt;span class="na"&gt;uniqueMembers=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"Date"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;CaptionExpression&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;SQL&lt;/span&gt; &lt;span class="na"&gt;dialect=&lt;/span&gt;&lt;span class="s"&gt;"generic"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;concat(toString(Year), '-', toString(Month), '-', toString(DayofMonth))&lt;span class="nt"&gt;&amp;lt;/SQL&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/CaptionExpression&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/Level&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Hierarchy&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Dimension&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Dimension&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Unique Carrier"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Hierarchy&lt;/span&gt; &lt;span class="na"&gt;hasAll=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;allMemberName=&lt;/span&gt;&lt;span class="s"&gt;"All Unique Carriers"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Level&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Unique Carrier"&lt;/span&gt; &lt;span class="na"&gt;uniqueMembers=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;KeyExpression&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;SQL&lt;/span&gt; &lt;span class="na"&gt;dialect=&lt;/span&gt;&lt;span class="s"&gt;"generic"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;toStringCutToZero(UniqueCarrier)&lt;span class="nt"&gt;&amp;lt;/SQL&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/KeyExpression&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/Level&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Hierarchy&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Dimension&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Dimension&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Destination"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Hierarchy&lt;/span&gt; &lt;span class="na"&gt;hasAll=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;allMemberName=&lt;/span&gt;&lt;span class="s"&gt;"All Destinations"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Level&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Destination State Name"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"DestStateName"&lt;/span&gt; &lt;span class="na"&gt;uniqueMembers=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Level&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Destination City"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"DestCityName"&lt;/span&gt; &lt;span class="na"&gt;uniqueMembers=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Hierarchy&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Dimension&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Dimension&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Origin"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Hierarchy&lt;/span&gt; &lt;span class="na"&gt;hasAll=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;allMemberName=&lt;/span&gt;&lt;span class="s"&gt;"All Origins"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Level&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Origin State Name"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"OriginStateName"&lt;/span&gt; &lt;span class="na"&gt;uniqueMembers=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Level&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Origin City"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"OriginCityName"&lt;/span&gt; &lt;span class="na"&gt;uniqueMembers=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Hierarchy&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Dimension&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Measure&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Flights"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"Flights"&lt;/span&gt; &lt;span class="na"&gt;aggregator=&lt;/span&gt;&lt;span class="s"&gt;"sum"&lt;/span&gt; &lt;span class="na"&gt;formatString=&lt;/span&gt;&lt;span class="s"&gt;"#,###"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Measure&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Air Time"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"AirTime"&lt;/span&gt; &lt;span class="na"&gt;aggregator=&lt;/span&gt;&lt;span class="s"&gt;"sum"&lt;/span&gt; &lt;span class="na"&gt;formatString=&lt;/span&gt;&lt;span class="s"&gt;"#,###"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Measure&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Distance"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"Distance"&lt;/span&gt; &lt;span class="na"&gt;aggregator=&lt;/span&gt;&lt;span class="s"&gt;"sum"&lt;/span&gt; &lt;span class="na"&gt;formatString=&lt;/span&gt;&lt;span class="s"&gt;"#,###"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Measure&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Dep Delay"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"DepDelay"&lt;/span&gt; &lt;span class="na"&gt;aggregator=&lt;/span&gt;&lt;span class="s"&gt;"sum"&lt;/span&gt; &lt;span class="na"&gt;formatString=&lt;/span&gt;&lt;span class="s"&gt;"#,###"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Measure&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Carrier Delay"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"CarrierDelay"&lt;/span&gt; &lt;span class="na"&gt;aggregator=&lt;/span&gt;&lt;span class="s"&gt;"sum"&lt;/span&gt; &lt;span class="na"&gt;formatString=&lt;/span&gt;&lt;span class="s"&gt;"#,###"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Measure&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Weather Delay"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"WeatherDelay"&lt;/span&gt; &lt;span class="na"&gt;aggregator=&lt;/span&gt;&lt;span class="s"&gt;"sum"&lt;/span&gt; &lt;span class="na"&gt;formatString=&lt;/span&gt;&lt;span class="s"&gt;"#,###"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Cube&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;Cube&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"ViewOnTime"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;View&lt;/span&gt; &lt;span class="na"&gt;alias=&lt;/span&gt;&lt;span class="s"&gt;"ViewOnTime"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;SQL&lt;/span&gt; &lt;span class="na"&gt;dialect=&lt;/span&gt;&lt;span class="s"&gt;"generic"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;![CDATA[select * from ontime]]&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/SQL&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/View&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Dimension&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Destination City Name"&lt;/span&gt; &lt;span class="na"&gt;foreignKey=&lt;/span&gt;&lt;span class="s"&gt;"DestCityName"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Hierarchy&lt;/span&gt; &lt;span class="na"&gt;hasAll=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;allMemberName=&lt;/span&gt;&lt;span class="s"&gt;"All Destinations"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Level&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Destination City Name"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"DestCityName"&lt;/span&gt; &lt;span class="na"&gt;uniqueMembers=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Hierarchy&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Dimension&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Dimension&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Origin City Name"&lt;/span&gt; &lt;span class="na"&gt;foreignKey=&lt;/span&gt;&lt;span class="s"&gt;"OriginCityName"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Hierarchy&lt;/span&gt; &lt;span class="na"&gt;hasAll=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="na"&gt;allMemberName=&lt;/span&gt;&lt;span class="s"&gt;"All Origin Cities"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;Level&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Origin City Name"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"OriginCityName"&lt;/span&gt; &lt;span class="na"&gt;uniqueMembers=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Hierarchy&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/Dimension&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;Measure&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Dep Delay"&lt;/span&gt; &lt;span class="na"&gt;column=&lt;/span&gt;&lt;span class="s"&gt;"DepDelay"&lt;/span&gt; &lt;span class="na"&gt;aggregator=&lt;/span&gt;&lt;span class="s"&gt;"sum"&lt;/span&gt; &lt;span class="na"&gt;formatString=&lt;/span&gt;&lt;span class="s"&gt;"#,###"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Cube&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/Schema&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You have to give rights to this file to the user under which Tomcat server is running. In the following command change the user &lt;code&gt;tomcat:tomcat&lt;/code&gt; name to the name under which your Tomcat server works and run it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-RH&lt;/span&gt; tomcat:tomcat &lt;span class="nv"&gt;$TOMCATDIR&lt;/span&gt;/webapps/emondrian/WEB-INF/schema/OnTime.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we will edit the Mondrian datasource configuration file. Run following command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano &lt;span class="nv"&gt;$TOMCATDIR&lt;/span&gt;/webapps/emondrian/WEB-INF/datasources.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the &lt;code&gt;DataSources&lt;/code&gt; tag with following xml.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;DataSources&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;DataSource&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DataSourceName&amp;gt;&lt;/span&gt;OnTime&lt;span class="nt"&gt;&amp;lt;/DataSourceName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DataSourceDescription&amp;gt;&lt;/span&gt;ClickHouse Sample Data&lt;span class="nt"&gt;&amp;lt;/DataSourceDescription&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;URL&amp;gt;&lt;/span&gt;http://localhost:8080/emondrian/xmla&lt;span class="nt"&gt;&amp;lt;/URL&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;DataSourceInfo&amp;gt;&lt;/span&gt;Provider=mondrian;Jdbc=jdbc:clickhouse://192.168.100.8:8123/datasets;JdbcDrivers=ru.yandex.clickhouse.ClickHouseDriver&lt;span class="nt"&gt;&amp;lt;/DataSourceInfo&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ProviderName&amp;gt;&lt;/span&gt;Mondrian&lt;span class="nt"&gt;&amp;lt;/ProviderName&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ProviderType&amp;gt;&lt;/span&gt;MDP&lt;span class="nt"&gt;&amp;lt;/ProviderType&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;AuthenticationMode&amp;gt;&lt;/span&gt;Unauthenticated&lt;span class="nt"&gt;&amp;lt;/AuthenticationMode&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;Catalogs&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;Catalog&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"OnTime"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;Definition&amp;gt;&lt;/span&gt;/WEB-INF/schema/OnTime.xml&lt;span class="nt"&gt;&amp;lt;/Definition&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/Catalog&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/Catalogs&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/DataSource&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/DataSources&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit connection string to your ClickHouse dataset in &lt;code&gt;DataSourceInfo&lt;/code&gt; tag using following syntax:&lt;br&gt;
&lt;code&gt;jdbc:clickhouse://&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;[/&amp;lt;database&amp;gt;][?user=&amp;lt;my_user&amp;gt;&amp;amp;password=&amp;lt;my_password&amp;gt;]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Save (&lt;em&gt;Ctrl-S&lt;/em&gt;) and close (&lt;em&gt;Ctrl-X&lt;/em&gt;) datasources file.&lt;br&gt;
Restart tomcat server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart tomcat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new connection to Mondrian server in Excel to see cubes from your new schema. Select one to browse its data in PivotTable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F62js75ef8igded12k3u6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F62js75ef8igded12k3u6.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try and create your one Mondrian schema for ClickHouse datasets (&lt;a href="https://sergeisemenkov.github.io/eMondrian/docs/Introduction" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;If you have any questions or suggestions, feel free to contact me at &lt;a href="mailto:siarhei.semiankou@gmail.com"&gt;siarhei.semiankou@gmail.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>clickhouse</category>
      <category>mondrian</category>
      <category>opensource</category>
      <category>excel</category>
    </item>
  </channel>
</rss>
