<?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>Forem: XLTable</title>
    <description>The latest articles on Forem by XLTable (@xltable).</description>
    <link>https://forem.com/xltable</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%2F3691086%2F694c0259-e9df-4d61-bc4c-298e287698c0.png</url>
      <title>Forem: XLTable</title>
      <link>https://forem.com/xltable</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/xltable"/>
    <language>en</language>
    <item>
      <title>XLTable + Snowflake: From Zero to Pivot Table in 15 Minutes</title>
      <dc:creator>XLTable</dc:creator>
      <pubDate>Sat, 04 Apr 2026 18:49:00 +0000</pubDate>
      <link>https://forem.com/xltable/xltable-snowflake-from-zero-to-pivot-table-in-15-minutes-1hdc</link>
      <guid>https://forem.com/xltable/xltable-snowflake-from-zero-to-pivot-table-in-15-minutes-1hdc</guid>
      <description>&lt;h1&gt;
  
  
  XLTable + Snowflake: From Zero to Pivot Table in 15 Minutes
&lt;/h1&gt;

&lt;p&gt;This guide shows how to connect Excel to Snowflake using XLTable — from creating sample tables to dragging measures into a Pivot Table.&lt;/p&gt;

&lt;p&gt;No custom data required. Everything runs on a free Snowflake trial account.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;By the end of this guide you will have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Snowflake database with realistic sales and inventory data&lt;/li&gt;
&lt;li&gt;An OLAP cube named &lt;code&gt;myOLAPcube&lt;/code&gt; registered in XLTable&lt;/li&gt;
&lt;li&gt;A live Excel Pivot Table connected to Snowflake — no CSV exports, no BI tools&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Data Model Overview
&lt;/h2&gt;

&lt;p&gt;The sample script creates 8 tables in the &lt;code&gt;olap.public&lt;/code&gt; schema:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Table&lt;/th&gt;
&lt;th&gt;Rows&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Times&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;731&lt;/td&gt;
&lt;td&gt;Calendar: every day of 2023–2024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Regions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Sales regions: North, South, East, West&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Managers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Sales managers linked to regions (many-to-many)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Stores&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Retail stores, each assigned to a region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Models&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Product models (Alpha … Theta)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Sales&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3 000&lt;/td&gt;
&lt;td&gt;Transactions: store, model, date, quantity, amount&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Stock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Inventory snapshots: store, model, quantity on hand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;olap_definition&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;OLAP cube definition read by XLTable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The relationships are straightforward: Sales and Stock facts join to Stores, Models, and the Times calendar. Stores belong to Regions, and Managers are linked to Regions in a many-to-many relationship.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Snowflake account (Trial or paid)&lt;/li&gt;
&lt;li&gt;A user with &lt;strong&gt;SYSADMIN&lt;/strong&gt; role or &lt;code&gt;CREATE DATABASE&lt;/code&gt; privilege&lt;/li&gt;
&lt;li&gt;A running virtual warehouse (e.g. &lt;code&gt;COMPUTE_WH&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;SnowSQL CLI installed, or access to Snowflake Worksheets&lt;/li&gt;
&lt;li&gt;XLTable server installed and running&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 1: Run the SQL Script
&lt;/h2&gt;

&lt;p&gt;Download the script and run it against your Snowflake account:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://xltable-olap.readthedocs.io/en/latest/_downloads/74a3508ae69ac187b80106c3229a825c/snowflake_sample.sql" rel="noopener noreferrer"&gt;Download snowflake_sample.sql&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A — SnowSQL CLI&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;snowsql &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--accountname&lt;/span&gt; &amp;lt;your_account&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--username&lt;/span&gt;    &amp;lt;user&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--dbname&lt;/span&gt;      olap &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--schemaname&lt;/span&gt;  public &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; snowflake_sample.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option B — Snowflake Worksheets&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Snowflake → Worksheets → + New Worksheet&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Paste the full script&lt;/li&gt;
&lt;li&gt;Select your warehouse&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Run All&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Verify the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;row_count&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;olap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information_schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tables&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;table_schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'PUBLIC'&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see 8 tables with the row counts from the table above.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Configure XLTable
&lt;/h2&gt;

&lt;p&gt;Open &lt;code&gt;/usr/olap/xltable/setting/settings.json&lt;/code&gt; and add the Snowflake connection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SERVER_DB"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Snowflake"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"CREDENTIAL_DB"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;user&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;password&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"account"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;your_account&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"warehouse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"COMPUTE_WH"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"olap.public"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"USERS"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"analyst"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"password123"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"USER_GROUPS"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"analyst"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"olap_users"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;XLTable discovers cubes automatically from the &lt;code&gt;olap_definition&lt;/code&gt; table — no additional cube configuration needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Restart XLTable
&lt;/h2&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;supervisorctl restart olap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 4: Connect Excel
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open Excel → &lt;strong&gt;Data → Get Data → From Database → From Analysis Services&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter the server URL: &lt;code&gt;http://your_server_ip&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Log in with &lt;code&gt;analyst / password123&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;myOLAPcube&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Drag measures and dimensions onto the Pivot Table&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What the Cube Exposes
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;myOLAPcube&lt;/code&gt; cube provides the following fields out of the box:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measures&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sales Quantity&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sum(sales.qty)&lt;/code&gt; across selected filters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sales Amount&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sum(sales.sum)&lt;/code&gt; — revenue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sales last year Quantity&lt;/td&gt;
&lt;td&gt;Same query, dates shifted +1 year via Jinja&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sales last year Amount&lt;/td&gt;
&lt;td&gt;Revenue for the same period last year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average Stock Quantity&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;avg(stock.qty)&lt;/code&gt; per store and model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Turnover&lt;/td&gt;
&lt;td&gt;Calculated: Sales Quantity ÷ Average Stock Quantity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Dimensions&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Store ID / Store&lt;/td&gt;
&lt;td&gt;Individual retail locations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;North · South · East · West&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manager&lt;/td&gt;
&lt;td&gt;Many-to-many with Region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;Alpha … Theta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Year / Quarter / Month / Day&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Dates&lt;/code&gt; hierarchy with full drill-down&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How the OLAP Cube Is Defined
&lt;/h2&gt;

&lt;p&gt;The cube definition lives inside the &lt;code&gt;olap_definition&lt;/code&gt; table as a SQL script with XLTable annotations. Each source section maps a SQL query to a set of measures or dimensions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;--olap_source Sales&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="c1"&gt;--olap_measures&lt;/span&gt;
 &lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;qty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sales_sum_qty&lt;/span&gt; &lt;span class="c1"&gt;--translation=`Sales Quantity`&lt;/span&gt;
&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sales_sum_sum&lt;/span&gt; &lt;span class="c1"&gt;--translation=`Sales Amount`&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;olap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sales&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;olap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stores&lt;/span&gt; &lt;span class="n"&gt;stores&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date_sale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;day_str&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Year-over-year comparison is handled with a Jinja transformation — XLTable rewrites the date column at query time, no separate table or materialized view needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;--olap_jinja&lt;/span&gt;
&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="n"&gt;sql_text&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="k"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"salesly.date_sale"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="nv"&gt;"TO_VARCHAR(DATEADD(YEAR, 1, TO_DATE(salesly.date_sale)), 'YYYY-MM-DD')"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Customising the Sample
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Extend the date range to 2025&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;Times&lt;/code&gt; table generator, change the row count from 731 to 1096 (731 + 365), then update the cube filter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;year_str&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2023'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2024'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'2025'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add more stores or models&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Extend the &lt;code&gt;VALUES&lt;/code&gt; lists in the &lt;code&gt;Stores&lt;/code&gt; / &lt;code&gt;Models&lt;/code&gt; sections and update the &lt;code&gt;MOD(..., 8)&lt;/code&gt; expressions in the Sales and Stock inserts to match the new total count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a different schema&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Replace every occurrence of &lt;code&gt;olap.public&lt;/code&gt; with your own database and schema, and update &lt;code&gt;"schema"&lt;/code&gt; in &lt;code&gt;settings.json&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Issues
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Database 'OLAP' does not exist&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run the first two statements manually before the rest of the script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;EXISTS&lt;/span&gt; &lt;span class="n"&gt;olap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;olap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;Insufficient privileges&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Switch to a role that has the required privileges:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;ROLE&lt;/span&gt; &lt;span class="n"&gt;SYSADMIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;Virtual warehouse is suspended&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Resume the warehouse before running the script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="n"&gt;WAREHOUSE&lt;/span&gt; &lt;span class="n"&gt;COMPUTE_WH&lt;/span&gt; &lt;span class="n"&gt;RESUME&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;No cubes visible in Excel&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Verify the definition row exists and check that &lt;code&gt;USER_GROUPS&lt;/code&gt; in &lt;code&gt;settings.json&lt;/code&gt; includes &lt;code&gt;"olap_users"&lt;/code&gt; for the connecting user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;olap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;olap_definition&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;Invalid account identifier&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;account&lt;/code&gt; field must use the Snowflake account locator format, e.g. &lt;code&gt;xy12345.eu-west-1&lt;/code&gt;. Find it in &lt;strong&gt;Snowflake UI → Admin → Accounts&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One SQL script creates a complete, realistic data model in Snowflake&lt;/li&gt;
&lt;li&gt;XLTable reads the cube definition directly from the database — no YAML, no GUI&lt;/li&gt;
&lt;li&gt;Excel connects natively via XMLA, with no plugins or data exports&lt;/li&gt;
&lt;li&gt;Year-over-year and inventory turnover work out of the box&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Download the sample script from the &lt;a href="https://xltable-olap.readthedocs.io/en/latest/snowflake_sample.html" rel="noopener noreferrer"&gt;XLTable documentation&lt;/a&gt; and follow the steps above.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://dev.to/"&gt;Get a 30-day XLTable trial&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://xltable-olap.readthedocs.io" rel="noopener noreferrer"&gt;Read the full documentation&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>snowflake</category>
      <category>excel</category>
    </item>
    <item>
      <title>XLTable: Bringing the OLAP Experience Back to Excel on Modern Data Warehouses</title>
      <dc:creator>XLTable</dc:creator>
      <pubDate>Thu, 29 Jan 2026 15:15:03 +0000</pubDate>
      <link>https://forem.com/xltable/xltable-bringing-the-olap-experience-back-to-excel-on-modern-data-warehouses-14i3</link>
      <guid>https://forem.com/xltable/xltable-bringing-the-olap-experience-back-to-excel-on-modern-data-warehouses-14i3</guid>
      <description>&lt;h1&gt;
  
  
  XLTable: Bringing the OLAP Experience Back to Excel on Modern Data Warehouses
&lt;/h1&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%2Fdxriohqilmktj9kt1t6q.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%2Fdxriohqilmktj9kt1t6q.png" alt="XLTable architecture" width="643" height="359"&gt;&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: data has grown, but users haven’t
&lt;/h2&gt;

&lt;p&gt;Business users have always worked with data.&lt;br&gt;&lt;br&gt;
For many years, Excel was the primary tool for analysis, and it worked well as long as datasets were relatively small.&lt;/p&gt;

&lt;p&gt;Over time, data volumes have grown dramatically. Today, meaningful analytical work often requires knowledge of SQL, Python, and modern data warehouses. These technologies are far beyond the skill set of most business users.&lt;/p&gt;

&lt;p&gt;As a result, companies are forced to involve data engineers, analysts, or BI specialists even for simple analytical questions. This increases cost, slows down decision-making, and creates a gap between business questions and answers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Excel is still alive
&lt;/h2&gt;

&lt;p&gt;Despite countless predictions, Excel has not disappeared.&lt;/p&gt;

&lt;p&gt;The reason is simple: Excel is intuitive. Pivot tables allow users to explore data freely — choosing metrics, slicing by dimensions, drilling down, and rearranging reports on the fly.&lt;/p&gt;

&lt;p&gt;No BI tool has fully replicated this combination of flexibility, speed, and familiarity for a broad audience.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why BI tools did not replace Excel
&lt;/h2&gt;

&lt;p&gt;Modern BI tools such as Power BI, Looker Studio, or DataLens are powerful and well-designed. However, they have not become a true replacement for Excel in everyday analytical work.&lt;/p&gt;

&lt;p&gt;In practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reports are often predefined,&lt;/li&gt;
&lt;li&gt;ad-hoc analysis is limited,&lt;/li&gt;
&lt;li&gt;semantic models require maintenance by specialists,&lt;/li&gt;
&lt;li&gt;users lose the feeling of direct interaction with data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When business users want to explore data independently, they still turn to Excel.&lt;/p&gt;




&lt;h2&gt;
  
  
  OLAP was the right idea
&lt;/h2&gt;

&lt;p&gt;Many years ago, Microsoft took an important step by introducing OLAP technology.&lt;/p&gt;

&lt;p&gt;The idea was simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data processing happens on a server,&lt;/li&gt;
&lt;li&gt;heavy computations are performed centrally,&lt;/li&gt;
&lt;li&gt;users work with data through Excel as a client.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allowed business users to work with large datasets using familiar Excel pivot tables, while all complexity remained on the server side. OLAP dramatically improved accessibility of analytics.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why classic OLAP stopped evolving
&lt;/h2&gt;

&lt;p&gt;Traditional OLAP systems rely on pre-calculated cubes and aggregations. While this approach worked well in the past, it does not align with modern data architectures.&lt;/p&gt;

&lt;p&gt;At the same time, columnar databases and cloud data warehouses became dominant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ClickHouse&lt;/li&gt;
&lt;li&gt;BigQuery&lt;/li&gt;
&lt;li&gt;Snowflake&lt;/li&gt;
&lt;li&gt;Redshift&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These systems are extremely fast and scalable, but working with them still requires SQL, Python, or BI tools.&lt;/p&gt;

&lt;p&gt;As a result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OLAP provides the right user experience but is technologically outdated,&lt;/li&gt;
&lt;li&gt;modern data warehouses are powerful but inaccessible to most users.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The idea behind XLTable
&lt;/h2&gt;

&lt;p&gt;XLTable was created to bridge this gap.&lt;/p&gt;

&lt;p&gt;Our goal is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give users the same experience they had with OLAP in Excel, but on top of modern columnar data warehouses.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Users should be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open Excel,&lt;/li&gt;
&lt;li&gt;connect to data,&lt;/li&gt;
&lt;li&gt;build pivot tables,&lt;/li&gt;
&lt;li&gt;work with measures and dimensions,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;without learning SQL or Python.&lt;/p&gt;




&lt;h2&gt;
  
  
  A short overview of OLAP principles
&lt;/h2&gt;

&lt;p&gt;OLAP is based on a multidimensional data model.&lt;/p&gt;

&lt;p&gt;Conceptually, data is represented as a multidimensional cube:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dimensions&lt;/strong&gt; define axes (time, products, customers, regions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measures&lt;/strong&gt; are stored in cube cells (revenue, quantity, average price)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a user asks a question like “revenue by year”, they select:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one measure (revenue),&lt;/li&gt;
&lt;li&gt;one dimension (year).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Excel pivot tables act as a client for OLAP systems, allowing users to arrange dimensions in rows and columns, apply filters, sorting, and drill-down operations.&lt;/p&gt;




&lt;h2&gt;
  
  
  OLAP vs columnar databases
&lt;/h2&gt;

&lt;p&gt;Classic OLAP systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;load data into cubes,&lt;/li&gt;
&lt;li&gt;pre-calculate aggregations,&lt;/li&gt;
&lt;li&gt;store results for fast access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Columnar databases work differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data is stored in raw, column-oriented form,&lt;/li&gt;
&lt;li&gt;aggregations are calculated on the fly,&lt;/li&gt;
&lt;li&gt;performance is achieved through compression, parallelism, and query optimization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modern columnar systems are designed to compute analytical queries efficiently without pre-aggregation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Shifting computation to the database
&lt;/h2&gt;

&lt;p&gt;XLTable follows a simple principle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All heavy computation should happen inside the database.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of pre-calculating cubes, XLTable delegates aggregations and grouping to the underlying columnar database, using it exactly for what it was designed for.&lt;/p&gt;

&lt;p&gt;XLTable acts as a semantic and protocol layer, not as a compute engine.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open OLAP standards: XMLA and MDX
&lt;/h2&gt;

&lt;p&gt;OLAP is an open technology.&lt;/p&gt;

&lt;p&gt;Besides Microsoft, OLAP servers have been implemented by multiple vendors such as Oracle and Hyperion. The ecosystem relies on two key standards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;XMLA (XML for Analysis)&lt;/strong&gt; — a protocol used by clients (such as Excel) to communicate with OLAP servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MDX&lt;/strong&gt; — a SQL-like query language for multidimensional data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When Excel works with an OLAP server, it sends XMLA requests containing embedded MDX queries.&lt;/p&gt;

&lt;p&gt;Microsoft published the XMLA specification, making it possible to implement compatible OLAP servers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What XLTable actually is
&lt;/h2&gt;

&lt;p&gt;XLTable is a custom OLAP-compatible server that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accepts XMLA requests from Excel over HTTP,&lt;/li&gt;
&lt;li&gt;translates MDX queries into SQL,&lt;/li&gt;
&lt;li&gt;executes them on modern data warehouses,&lt;/li&gt;
&lt;li&gt;returns results back to Excel in XMLA format.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From Excel’s perspective, XLTable behaves like a classic OLAP server.&lt;br&gt;&lt;br&gt;
From the database’s perspective, XLTable is a client that generates optimized SQL.&lt;/p&gt;




&lt;h2&gt;
  
  
  Defining the semantic model
&lt;/h2&gt;

&lt;p&gt;Any OLAP system requires a semantic model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;measures,&lt;/li&gt;
&lt;li&gt;dimensions,&lt;/li&gt;
&lt;li&gt;and mappings to source tables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Microsoft OLAP, this model is defined using graphical tools in Visual Studio.&lt;/p&gt;

&lt;p&gt;XLTable takes a different approach. The semantic model is defined using SQL-based configuration scripts.&lt;/p&gt;

&lt;p&gt;This approach is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;simpler and more transparent,&lt;/li&gt;
&lt;li&gt;easier to version and maintain,&lt;/li&gt;
&lt;li&gt;explicit in terms of generated SQL,&lt;/li&gt;
&lt;li&gt;important for performance and cost control, especially in systems like BigQuery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the model is defined, users simply connect to it from Excel.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key features of XLTable
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fully proprietary, in-house development
&lt;/li&gt;
&lt;li&gt;All data processing happens inside the database (e.g. Snowflake)
&lt;/li&gt;
&lt;li&gt;Support for multiple measure groups, dimensions, and hierarchies in a single cube
&lt;/li&gt;
&lt;li&gt;Flexible caching strategies
&lt;/li&gt;
&lt;li&gt;LDAP / Active Directory integration
&lt;/li&gt;
&lt;li&gt;Fine-grained access control:

&lt;ul&gt;
&lt;li&gt;by measures,&lt;/li&gt;
&lt;li&gt;by dimensions,&lt;/li&gt;
&lt;li&gt;by dimension members
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  Performance and scalability
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;XLTable does not perform aggregation or grouping itself
&lt;/li&gt;
&lt;li&gt;It receives MDX from Excel, translates it to SQL, and executes it in the database
&lt;/li&gt;
&lt;li&gt;This process requires minimal server resources
&lt;/li&gt;
&lt;li&gt;Performance depends entirely on database configuration, which aligns with columnar database design
&lt;/li&gt;
&lt;li&gt;Results can be cached at user or server level
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are no artificial limits on the number of dimensions or measure groups.&lt;/p&gt;

&lt;p&gt;A typical production configuration includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;~30 source tables
&lt;/li&gt;
&lt;li&gt;total data volume around 2 TB
&lt;/li&gt;
&lt;li&gt;individual tables with up to 2 billion rows
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What’s next
&lt;/h2&gt;

&lt;p&gt;In the next article, we will walk through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;installation,&lt;/li&gt;
&lt;li&gt;configuration,&lt;/li&gt;
&lt;li&gt;and the first connection from Excel to XLTable.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>excel</category>
      <category>dataengineering</category>
      <category>analytics</category>
      <category>datawarehouse</category>
    </item>
    <item>
      <title>Connect Snowflake to Excel Pivot Tables with XLTable</title>
      <dc:creator>XLTable</dc:creator>
      <pubDate>Sat, 03 Jan 2026 09:57:26 +0000</pubDate>
      <link>https://forem.com/xltable/connect-snowflake-to-excel-pivot-tables-with-xltable-34f8</link>
      <guid>https://forem.com/xltable/connect-snowflake-to-excel-pivot-tables-with-xltable-34f8</guid>
      <description>&lt;h1&gt;
  
  
  How to Connect Snowflake to Excel Pivot Tables (Without BI Tools or Data Exports)
&lt;/h1&gt;

&lt;p&gt;Excel is still the most popular analytics tool for business users.&lt;br&gt;&lt;br&gt;
Finance teams, sales managers, and executives rely on Excel Pivot Tables because they are fast, flexible, and familiar.&lt;/p&gt;

&lt;p&gt;At the same time, modern companies store analytical data in Snowflake — a cloud data platform built for large-scale analytics.&lt;/p&gt;

&lt;p&gt;Yet connecting &lt;strong&gt;Snowflake to Excel Pivot Tables&lt;/strong&gt; is still surprisingly difficult.&lt;/p&gt;

&lt;p&gt;Most teams rely on CSV exports, custom SQL queries, or heavy BI tools — all of which limit true self-service analytics.&lt;/p&gt;

&lt;p&gt;In this article, we’ll explain &lt;strong&gt;how to connect Snowflake to Excel properly&lt;/strong&gt;, why exports don’t scale, and &lt;strong&gt;why OLAP is the missing layer&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Snowflake + Excel Gap
&lt;/h2&gt;

&lt;p&gt;Snowflake is excellent at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;large-scale analytics
&lt;/li&gt;
&lt;li&gt;elastic compute
&lt;/li&gt;
&lt;li&gt;centralized data storage
&lt;/li&gt;
&lt;li&gt;governance and security
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Excel is excellent at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ad-hoc analysis
&lt;/li&gt;
&lt;li&gt;Pivot Tables
&lt;/li&gt;
&lt;li&gt;business exploration
&lt;/li&gt;
&lt;li&gt;fast decision making
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But in many companies, these tools don’t work together smoothly.&lt;/p&gt;

&lt;h3&gt;
  
  
  A typical workflow today
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Analyst writes SQL in Snowflake
&lt;/li&gt;
&lt;li&gt;Exports data to CSV or Excel
&lt;/li&gt;
&lt;li&gt;Sends files to business users
&lt;/li&gt;
&lt;li&gt;Filters change, numbers drift
&lt;/li&gt;
&lt;li&gt;Trust is lost
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This workflow does &lt;strong&gt;not scale&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why CSV Exports from Snowflake Do Not Scale
&lt;/h2&gt;

&lt;p&gt;Exporting data from Snowflake may look simple, but it creates serious problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No live data
&lt;/li&gt;
&lt;li&gt;Manual refreshes
&lt;/li&gt;
&lt;li&gt;Multiple versions of truth
&lt;/li&gt;
&lt;li&gt;Broken security model
&lt;/li&gt;
&lt;li&gt;No semantic layer
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly, &lt;strong&gt;business users don’t want raw tables&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
They want &lt;strong&gt;Pivot Tables&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why BI Tools Are Often Too Heavy
&lt;/h2&gt;

&lt;p&gt;Power BI, Tableau, Looker, and similar tools solve some problems — but create others:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;per-user licensing costs
&lt;/li&gt;
&lt;li&gt;additional infrastructure
&lt;/li&gt;
&lt;li&gt;dashboards instead of exploration
&lt;/li&gt;
&lt;li&gt;another UI to learn
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Many companies discover a frustrating reality:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;After dashboards are built, users still export data to Excel.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What Excel Pivot Tables Actually Need
&lt;/h2&gt;

&lt;p&gt;Excel Pivot Tables do not work well with raw SQL tables.&lt;/p&gt;

&lt;p&gt;They expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dimensions and measures
&lt;/li&gt;
&lt;li&gt;hierarchies
&lt;/li&gt;
&lt;li&gt;aggregations
&lt;/li&gt;
&lt;li&gt;metadata
&lt;/li&gt;
&lt;li&gt;a semantic layer
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly what &lt;strong&gt;OLAP&lt;/strong&gt; provides.&lt;/p&gt;




&lt;h2&gt;
  
  
  OLAP as the Missing Layer for Snowflake
&lt;/h2&gt;

&lt;p&gt;OLAP sits between &lt;strong&gt;Snowflake&lt;/strong&gt; and &lt;strong&gt;Excel&lt;/strong&gt;, translating analytical data into a structure Excel understands.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture: Snowflake → OLAP → Excel
&lt;/h3&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%2Fyuyjvsvy7wcgi5ggtk99.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%2Fyuyjvsvy7wcgi5ggtk99.png" alt="Snowflake to Excel OLAP architecture" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How XLTable Fits Into This Architecture
&lt;/h2&gt;

&lt;p&gt;This Snowflake → OLAP → Excel architecture is exactly what &lt;strong&gt;XLTable&lt;/strong&gt; is built for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;XLTable&lt;/strong&gt; is an OLAP server designed to sit between Snowflake and Excel, providing a semantic layer that Excel Pivot Tables can work with natively.&lt;/p&gt;

&lt;p&gt;Instead of exporting data or building dashboards, XLTable allows business users to connect directly to Snowflake using familiar Excel Pivot Tables — while all data, logic, and governance remain in Snowflake.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key principles behind XLTable
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Snowflake stays the single source of truth
&lt;/li&gt;
&lt;li&gt;Business logic is defined once, centrally
&lt;/li&gt;
&lt;li&gt;Excel users work with Pivot Tables, not SQL
&lt;/li&gt;
&lt;li&gt;No CSV exports or data duplication
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What XLTable Provides
&lt;/h2&gt;

&lt;p&gt;XLTable implements this architecture as a production-ready OLAP layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OLAP cubes on top of Snowflake
&lt;/li&gt;
&lt;li&gt;Native Excel Pivot Table connectivity via XMLA
&lt;/li&gt;
&lt;li&gt;Centralized definitions for measures and dimensions
&lt;/li&gt;
&lt;li&gt;Secure, read-only access to analytical data
&lt;/li&gt;
&lt;li&gt;Scalable query generation optimized for Snowflake
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the Excel user’s perspective, nothing changes — they simply connect to a cube and start building Pivot Tables.&lt;/p&gt;

&lt;p&gt;From the data team’s perspective, calculations, access rules, and performance are finally under control.&lt;/p&gt;




&lt;h2&gt;
  
  
  Typical Use Cases for XLTable
&lt;/h2&gt;

&lt;p&gt;XLTable is commonly used when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finance teams need live P&amp;amp;L or revenue analysis in Excel
&lt;/li&gt;
&lt;li&gt;Sales teams analyze performance by region, product, or customer
&lt;/li&gt;
&lt;li&gt;Operations teams explore large datasets without waiting for dashboards
&lt;/li&gt;
&lt;li&gt;Data teams want to reduce BI license and maintenance costs
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In all cases, Snowflake remains the backend — Excel becomes the interface.&lt;/p&gt;




&lt;h2&gt;
  
  
  Excel Is Still a BI Tool — When Connected Correctly
&lt;/h2&gt;

&lt;p&gt;Excel is not outdated.&lt;/p&gt;

&lt;p&gt;Disconnected Excel is.&lt;/p&gt;

&lt;p&gt;When Excel works directly with Snowflake through an OLAP layer, it becomes a powerful, scalable analytics interface.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CSV exports from Snowflake don’t scale
&lt;/li&gt;
&lt;li&gt;BI tools are often heavier than needed
&lt;/li&gt;
&lt;li&gt;Excel Pivot Tables require a semantic layer
&lt;/li&gt;
&lt;li&gt;OLAP bridges Snowflake and Excel
&lt;/li&gt;
&lt;li&gt;XLTable provides this missing layer
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  See Snowflake Analytics in Excel with XLTable
&lt;/h2&gt;

&lt;p&gt;If your company uses Snowflake and Excel is still the primary analytics tool for business users, XLTable provides the missing connection between them.&lt;/p&gt;

&lt;p&gt;You don’t replace Snowflake.&lt;br&gt;&lt;br&gt;
You don’t replace Excel.  &lt;/p&gt;

&lt;p&gt;You simply connect them correctly.&lt;/p&gt;

</description>
      <category>excel</category>
      <category>snowflake</category>
      <category>olap</category>
      <category>analytics</category>
    </item>
  </channel>
</rss>
