Skip to content

TPC-DS Q46 — Store Sales Household Analysis

TPC-DS benchmark · all TPC-DS queries

Reports store sales by customer household across cities

Representative SQL

Rendered for DataFusion with default parameters.

SELECT
c_last_name,
c_first_name,
ca_city,
bought_city,
ss_ticket_number,
amt,
profit
FROM (
SELECT
ss_ticket_number,
ss_customer_sk,
ca_city AS bought_city,
SUM(ss_coupon_amt) AS amt,
SUM(ss_net_profit) AS profit
FROM store_sales, date_dim, store, household_demographics, customer_address
WHERE
store_sales.ss_sold_date_sk = date_dim.d_date_sk
AND store_sales.ss_store_sk = store.s_store_sk
AND store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk
AND store_sales.ss_addr_sk = customer_address.ca_address_sk
AND (
household_demographics.hd_dep_count = 5
OR household_demographics.hd_vehicle_count = 3
)
AND date_dim.d_dow IN (6, 0)
AND date_dim.d_year IN (1999, 1999 + 1, 1999 + 2)
AND store.s_city IN ('Midway', 'Fairview', 'Fairview', 'Midway', 'Fairview')
GROUP BY
ss_ticket_number,
ss_customer_sk,
ss_addr_sk,
ca_city
) AS dn, customer, customer_address AS current_addr
WHERE
ss_customer_sk = c_customer_sk
AND customer.c_current_addr_sk = current_addr.ca_address_sk
AND current_addr.ca_city <> bought_city
ORDER BY
c_last_name,
c_first_name,
ca_city,
bought_city,
ss_ticket_number
LIMIT 100

Representative DataFrame

Expression family (Polars, PySpark, DataFusion), default parameters.

def q46_expression_impl(ctx: DataFrameContext) -> Any:
inner = _ticket_household_inner_expression(
ctx,
46,
1999,
["Midway", "Fairview", "Fairview", "Fairview", "Fairview"],
5,
(("amt", "ss_coupon_amt"), ("profit", "ss_net_profit")),
dow_list=(6, 0),
)
return _ticket_household_outer_expression(
ctx,
inner,
["c_last_name", "c_first_name", "ca_city", "bought_city", "ss_ticket_number", "amt", "profit"],
["c_last_name", "c_first_name", "ca_city", "bought_city", "ss_ticket_number"],
)

Get the exact query for your run

The blocks above are representative. To get the precise statement a specific platform runs at a specific scale, substitute your own values:

from benchbox import TPCDS
bench = TPCDS(scale_factor=1.0) # your scale factor
queries = bench.get_queries(dialect="datafusion") # your platform's dialect; drop dialect= for native SQL
print(queries['46'])

Parameter substitution for this benchmark is seed-driven; pass a seed for a specific stream’s parameters:

print(bench.get_query(46, scale_factor=1.0, seed=42, dialect="datafusion"))

For the DataFrame form:

from benchbox.core.query_catalog import get_dataframe_render
print(get_dataframe_render('tpcds', '46', family="expression").source) # or family="pandas"

Source

Query text: _sources/tpc-ds/query_templates/query46.tpl