WITH
Use WITH to apply optional modifiers, which are keywords that add result columns or change how ShopifyQL calculates results. Modifiers can add generated result columns, change currency and timezone calculations, or calculate cumulative values.
Use one WITH clause for each query. To apply more than one modifier, separate modifiers with commas in the same WITH clause.
Syntax
Anchor to ModifiersModifiers
Choose optional query modifiers for generated columns, currency and timezone calculations, or cumulative values. Modifier-specific sections describe output columns and constraints.
- Anchor to TOTALSTOTALSTOTALSWITH TOTALSWITH TOTALS
Adds top-level metric total columns named
.- Anchor to GROUP_TOTALSGROUP_
TOTALSGROUP_ TOTALS WITH GROUP_TOTALSWITH GROUP_TOTALS Adds totals for grouped dimensions named
.- Anchor to PERCENT_CHANGEPERCENT_
CHANGEPERCENT_ CHANGE WITH PERCENT_CHANGEWITH PERCENT_CHANGE Adds percent-change columns for each comparison metric.
- Anchor to CUMULATIVE_VALUESCUMULATIVE_
VALUESCUMULATIVE_ VALUES WITH CUMULATIVE_VALUESWITH CUMULATIVE_VALUES Adds running-total columns for additive metrics.
- Anchor to CURRENCYCURRENCYCURRENCYWITH CURRENCY '<currency_code>'WITH CURRENCY '<currency_code>'
Runs currency calculations in the specified currency.
- Anchor to TIMEZONETIMEZONETIMEZONEWITH TIMEZONE '<iana_timezone>'WITH TIMEZONE '<iana_timezone>'
Runs time-based calculations in the specified IANA timezone.
ShopifyQL
Examples
Description
Track daily [`total_sales`](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesmetric-propertydetail-totalsales) over the last 30 days with both an overall total and a running total. This example uses [`WITH TOTALS`](#total-columns) for the period total and [`CUMULATIVE_VALUES`](#cumulative-values) for the running sum that builds across the series.
ShopifyQL
FROM sales SHOW total_sales TIMESERIES day WITH TOTALS, CUMULATIVE_VALUES SINCE -30d UNTIL today ORDER BY day ASCDescription
Group [`sessions`](/docs/api/shopifyql/2026-01/schemas/sessions_and_behavior/sessions#sessionsmetric-propertydetail-sessions) [by country](/docs/api/shopifyql/2026-01/schemas/sessions_and_behavior/sessions#sessionsdimension-propertydetail-sessioncountry) and [device type](/docs/api/shopifyql/2026-01/schemas/sessions_and_behavior/sessions#sessionsdimension-propertydetail-sessiondevicetype) last month with [`GROUP_TOTALS`](#group-total-columns) applied. Grouping by these two dimensions adds a `sessions__session_country_totals` column with each country's subtotal across device types.
ShopifyQL
FROM sessions SHOW sessions GROUP BY session_country, session_device_type WITH GROUP_TOTALS DURING last_month ORDER BY sessions DESC
Anchor to Generated result columnsGenerated result columns
Some WITH modifiers add generated result columns in addition to the columns that SHOW returns. ShopifyQL bases each generated column name on the metric name that the query returns. If a field in SHOW uses AS, then ShopifyQL uses the alias in the generated column name.
You can use generated result columns in clauses that operate on returned values, such as ORDER BY and VISUALIZE, when the columns are valid for the query.
When a WITH modifier adds generated result columns, not all of them can be used in HAVING. For more information about filtering aggregated results, refer to HAVING.
When a WITH modifier adds generated result columns, not all of them can be used in HAVING. For more information about filtering aggregated results, refer to HAVING.
Anchor to Total columnsTotal columns
WITH TOTALS adds a total column for each metric, aggregated across the entire result set, when a query groups results with GROUP BY or TIMESERIES. ShopifyQL sums additive metrics like net_sales, and recomputes ratio and percentage metrics, such as average_order_value, over the full result set instead of summing the grouped rows. ShopifyQL adds the __totals suffix to each metric name:
net_sales__totalsis the totals column generated fornet_sales.
Anchor to Group total columnsGroup total columns
WITH GROUP_TOTALS adds subtotal columns when a query groups by at least two dimensions. ShopifyQL generates a subtotal column for each prefix of the grouped dimensions except the full set, so grouping by three dimensions adds two subtotal columns. ShopifyQL names each column after the metric and the dimensions in its prefix:
- Grouping by two dimensions adds one column,
{metric_name}__{first_dimension}_totals, such astotal_sales__country_totalsfor thecountrysubtotal oftotal_sales. - Grouping by three dimensions adds two columns,
{metric_name}__{first_dimension}_totalsand{metric_name}__{first_dimension}_{second_dimension}_totals, in the order of the grouped dimensions.
Anchor to Percent-change columnsPercent-change columns
When the reporting period runs up to now or today, ShopifyQL compares each period only through the same point in its grain, so a partial current period is measured against an equal period-to-date instead of against a full prior period. For example, on the 17th of a month, each comparison month is measured through its own 17th.
WITH PERCENT_CHANGE adds columns for date comparison metrics created by COMPARE TO. Without a date comparison, this modifier doesn't add percent-change result columns. ShopifyQL names each column after the compared metric and the comparison period:
- A relative comparison, such as
COMPARE TO previous_year, generatespercent_change_net_sales__previous_year. - A date-function comparison generates a column such as
percent_change_total_sales__startOfQuarter_sub_3q, where minus signs in the date function becomesub.
ShopifyQL
Examples
Description
List the 10 [sales channels](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesdimension-propertydetail-saleschannel) with the highest [`net_sales`](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesmetric-propertydetail-netsales) over the last 30 days, each shown beside the store-wide total. This example uses [`WITH TOTALS`](#total-columns) to generate a `net_sales__totals` column. The ranking comes from [`ORDER BY`](/docs/api/shopifyql/2026-01/syntax/order-by) `net_sales DESC`, because the total is identical on every row.
ShopifyQL
FROM sales SHOW net_sales GROUP BY sales_channel WITH TOTALS SINCE -30d UNTIL today ORDER BY net_sales__totals DESC, net_sales DESC LIMIT 10Description
Rank billing-country and product-type rows by [`total_sales`](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesmetric-propertydetail-totalsales) for last month. This example uses [`WITH GROUP_TOTALS`](#group-total-columns) to generate a `total_sales__billing_country_totals` column, then orders by the country subtotal before each product-type value.
ShopifyQL
FROM sales SHOW total_sales GROUP BY billing_country, product_type WITH GROUP_TOTALS DURING last_month ORDER BY total_sales__billing_country_totals DESC, total_sales DESC LIMIT 10Description
Group [`net_sales`](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesmetric-propertydetail-netsales) by day, sales channel, and product type for last month. This example uses [`WITH GROUP_TOTALS`](#group-total-columns) to generate subtotal columns for each grouped-dimension prefix, including `net_sales__day_sales_channel_totals`.
ShopifyQL
FROM sales SHOW net_sales GROUP BY day, sales_channel, product_type WITH GROUP_TOTALS DURING last_month ORDER BY net_sales__day_sales_channel_totals DESC, day ASC LIMIT 10Description
Compare monthly [`net_sales`](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesmetric-propertydetail-netsales) for this year against last year. This example uses [`PERCENT_CHANGE`](#percent-change-columns) with a relative [`COMPARE TO`](/docs/api/shopifyql/2026-01/syntax/compare-to) period, then visualizes the generated `percent_change_net_sales__previous_year` column.
ShopifyQL
FROM sales SHOW net_sales TIMESERIES month WITH PERCENT_CHANGE DURING this_year COMPARE TO previous_year ORDER BY month ASC VISUALIZE percent_change_net_sales__previous_year TYPE lineDescription
Compare [`total_sales`](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesmetric-propertydetail-totalsales) by sales channel for a previous quarter against an earlier quarter. This example uses [`PERCENT_CHANGE`](#percent-change-columns) with date-function [`COMPARE TO`](/docs/api/shopifyql/2026-01/syntax/compare-to) arguments, then orders by the generated `percent_change_total_sales__startOfQuarter_sub_3q` column.
ShopifyQL
FROM sales SHOW total_sales GROUP BY sales_channel WITH PERCENT_CHANGE SINCE startOfQuarter(-1q) UNTIL endOfQuarter(-1q) COMPARE TO startOfQuarter(-3q) UNTIL endOfQuarter(-3q) ORDER BY percent_change_total_sales__startOfQuarter_sub_3q DESC LIMIT 10
Anchor to Cumulative valuesCumulative values
WITH CUMULATIVE_VALUES adds a running-total column for each additive metric, where summing values across time is meaningful, such as sums and counts like net_sales, orders, and customers. Ratio and average metrics, such as average_order_value or conversion_rate, don't generate cumulative columns.
Cumulative values require a time-based order, so combine CUMULATIVE_VALUES with TIMESERIES or ORDER BY on a time dimension. Reference a generated running total by the metric's __cumulative column, or by its alias if the metric is renamed with AS.
ShopifyQL
Examples
Description
Track daily [`net_sales`](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesmetric-propertydetail-netsales) for last month with a generated `net_sales__cumulative` column. This example visualizes the cumulative column so the chart shows the running total instead of each day's value.
ShopifyQL
FROM sales SHOW net_sales TIMESERIES day WITH CUMULATIVE_VALUES DURING last_month ORDER BY day ASC VISUALIZE net_sales__cumulative TYPE lineDescription
Track weekly [`total_sales`](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesmetric-propertydetail-totalsales) and `orders` for this quarter, each with a running-total column. This example uses [`CUMULATIVE_VALUES`](#cumulative-values) with eligible additive metrics, so each week shows the quarter so far.
ShopifyQL
FROM sales SHOW total_sales, orders TIMESERIES week WITH CUMULATIVE_VALUES DURING this_quarter ORDER BY week ASCDescription
Summarize [`net_sales`](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesmetric-propertydetail-netsales) by day over the last 30 days. This example shows how [`CUMULATIVE_VALUES`](#cumulative-values) works on a grouped time dimension when [`ORDER BY`](/docs/api/shopifyql/2026-01/syntax/order-by) sorts the dates in ascending order.
ShopifyQL
FROM sales SHOW net_sales GROUP BY day WITH CUMULATIVE_VALUES SINCE -30d UNTIL today ORDER BY day ASC
Anchor to Currency and timezoneCurrency and timezone
Use WITH CURRENCY '<currency_code>' to run currency calculations using a valid currency code. Use WITH TIMEZONE '<iana_timezone>' to run time-based calculations using a valid IANA timezone. Both values are strings, so wrap them in single quotes.
ShopifyQL
Examples
Description
Report [`gross_sales`](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesmetric-propertydetail-grosssales), `discounts`, and `net_sales` for last month in US dollars. This example uses [`WITH CURRENCY 'USD'`](#currency-and-timezone) to present the monetary metrics in that currency.
ShopifyQL
FROM sales SHOW gross_sales, discounts, net_sales WITH CURRENCY 'USD' SINCE startOfMonth(-1m) UNTIL endOfMonth(-1m)Description
Report [`gross_sales`](/docs/api/shopifyql/2026-01/schemas/sales_revenue/sales#salesmetric-propertydetail-grosssales), `discounts`, and `net_sales` for last month in the `America/New_York` timezone. This example uses [`WITH TIMEZONE`](#currency-and-timezone) to resolve the `startOfMonth` and `endOfMonth` boundaries in that zone, so sales near the start or end of the month shift into or out of the last-month total.
ShopifyQL
FROM sales SHOW gross_sales, discounts, net_sales WITH TIMEZONE 'America/New_York' SINCE startOfMonth(-1m) UNTIL endOfMonth(-1m)