<?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.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>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;p&gt;Check our newest video on how &lt;a href="https://sergeisemenkov.github.io/eMondrian/"&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 width="710" height="399" src="https://www.youtube.com/embed/kmpBqEFKZWA"&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/"&gt;Leandro Aeschlimann&lt;/a&gt;. His company &lt;a href="https://www.linkedin.com/company/consenso-solutions/"&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>
    </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;p&gt;Welcome to the site of the &lt;a href="https://sergeisemenkov.github.io/eMondrian"&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"&gt;OLAP&lt;/a&gt; server. It is based on the &lt;a href="https://github.com/pentaho/mondrian"&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://res.cloudinary.com/practicaldev/image/fetch/s--LqeQ3pxf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j34edhvspxe64fjrw52k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LqeQ3pxf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j34edhvspxe64fjrw52k.png" alt="Image description" width="880" height="343"&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"&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"&gt;column store databases&lt;/a&gt; as data sources for eMondrian. For example, &lt;a href="https://clickhouse.com/"&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>
    </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;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"&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/"&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://res.cloudinary.com/practicaldev/image/fetch/s--pu8phEZf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ecnz19o03ha2u4ik373k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pu8phEZf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ecnz19o03ha2u4ik373k.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"&gt;https://ssemenkoff.dev/emondrian/xmla&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LqElmmcp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ddwbgta4ggsy23tlfkvt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LqElmmcp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ddwbgta4ggsy23tlfkvt.png" alt="" 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://res.cloudinary.com/practicaldev/image/fetch/s--5udR--e_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/om894p54k8cxr5b3n3ks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5udR--e_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/om894p54k8cxr5b3n3ks.png" alt="" width="880" height="615"&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://res.cloudinary.com/practicaldev/image/fetch/s--PS48wxVK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jdmo9cpzthazaszbwqog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PS48wxVK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jdmo9cpzthazaszbwqog.png" alt="" width="880" height="451"&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;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://media.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://media.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"&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://media.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://media.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"&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://media.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://media.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"&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://media.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://media.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"&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://media.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://media.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"&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://media.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://media.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"&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://media.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://media.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"&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;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;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

export TOMCATDIR="/opt/tomcat/latest"


&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;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo wget https://github.com/SergeiSemenkov/eMondrian/releases/latest/download/emondrian.war
sudo cp emondrian.war $TOMCATDIR/webapps
sudo 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;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

hostname -I


&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://media.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://media.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://media.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://media.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://media.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://media.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;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo nano $TOMCATDIR/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;/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;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo chown -RH tomcat:tomcat $TOMCATDIR/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;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo nano $TOMCATDIR/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;/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;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo 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://media.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://media.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>
