-- SQLBench-DS query 23 derived from TPC-DS query 23 under the terms of the TPC Fair Use Policy.
-- TPC-DS queries are Copyright 2021 Transaction Processing Performance Council.
-- This query was generated at scale factor 1.
with
  frequent_ss_items as (
    select
      substr (i_item_desc, 1, 30) itemdesc,
      i_item_sk item_sk,
      d_date solddate,
      count(*) cnt
    from
      store_sales,
      date_dim,
      item
    where
      ss_sold_date_sk = d_date_sk
      and ss_item_sk = i_item_sk
      and d_year in (2000, 2000 + 1, 2000 + 2, 2000 + 3)
    group by
      substr (i_item_desc, 1, 30),
      i_item_sk,
      d_date
    having
      count(*) > 4
  ),
  max_store_sales as (
    select
      max(csales) tpcds_cmax
    from
      (
        select
          c_customer_sk,
          sum(ss_quantity * ss_sales_price) csales
        from
          store_sales,
          customer,
          date_dim
        where
          ss_customer_sk = c_customer_sk
          and ss_sold_date_sk = d_date_sk
          and d_year in (2000, 2000 + 1, 2000 + 2, 2000 + 3)
        group by
          c_customer_sk
      )
  ),
  best_ss_customer as (
    select
      c_customer_sk,
      sum(ss_quantity * ss_sales_price) ssales
    from
      store_sales,
      customer
    where
      ss_customer_sk = c_customer_sk
    group by
      c_customer_sk
    having
      sum(ss_quantity * ss_sales_price) > (95 / 100.0) * (
        select
          *
        from
          max_store_sales
      )
  )
select
  sum(sales)
from
  (
    select
      cs_quantity * cs_list_price sales
    from
      catalog_sales,
      date_dim
    where
      d_year = 2000
      and d_moy = 3
      and cs_sold_date_sk = d_date_sk
      and cs_item_sk in (
        select
          item_sk
        from
          frequent_ss_items
      )
      and cs_bill_customer_sk in (
        select
          c_customer_sk
        from
          best_ss_customer
      )
    union all
    select
      ws_quantity * ws_list_price sales
    from
      web_sales,
      date_dim
    where
      d_year = 2000
      and d_moy = 3
      and ws_sold_date_sk = d_date_sk
      and ws_item_sk in (
        select
          item_sk
        from
          frequent_ss_items
      )
      and ws_bill_customer_sk in (
        select
          c_customer_sk
        from
          best_ss_customer
      )
  )
LIMIT
  100;

with
  frequent_ss_items as (
    select
      substr (i_item_desc, 1, 30) itemdesc,
      i_item_sk item_sk,
      d_date solddate,
      count(*) cnt
    from
      store_sales,
      date_dim,
      item
    where
      ss_sold_date_sk = d_date_sk
      and ss_item_sk = i_item_sk
      and d_year in (2000, 2000 + 1, 2000 + 2, 2000 + 3)
    group by
      substr (i_item_desc, 1, 30),
      i_item_sk,
      d_date
    having
      count(*) > 4
  ),
  max_store_sales as (
    select
      max(csales) tpcds_cmax
    from
      (
        select
          c_customer_sk,
          sum(ss_quantity * ss_sales_price) csales
        from
          store_sales,
          customer,
          date_dim
        where
          ss_customer_sk = c_customer_sk
          and ss_sold_date_sk = d_date_sk
          and d_year in (2000, 2000 + 1, 2000 + 2, 2000 + 3)
        group by
          c_customer_sk
      )
  ),
  best_ss_customer as (
    select
      c_customer_sk,
      sum(ss_quantity * ss_sales_price) ssales
    from
      store_sales,
      customer
    where
      ss_customer_sk = c_customer_sk
    group by
      c_customer_sk
    having
      sum(ss_quantity * ss_sales_price) > (95 / 100.0) * (
        select
          *
        from
          max_store_sales
      )
  )
select
  c_last_name,
  c_first_name,
  sales
from
  (
    select
      c_last_name,
      c_first_name,
      sum(cs_quantity * cs_list_price) sales
    from
      catalog_sales,
      customer,
      date_dim
    where
      d_year = 2000
      and d_moy = 3
      and cs_sold_date_sk = d_date_sk
      and cs_item_sk in (
        select
          item_sk
        from
          frequent_ss_items
      )
      and cs_bill_customer_sk in (
        select
          c_customer_sk
        from
          best_ss_customer
      )
      and cs_bill_customer_sk = c_customer_sk
    group by
      c_last_name,
      c_first_name
    union all
    select
      c_last_name,
      c_first_name,
      sum(ws_quantity * ws_list_price) sales
    from
      web_sales,
      customer,
      date_dim
    where
      d_year = 2000
      and d_moy = 3
      and ws_sold_date_sk = d_date_sk
      and ws_item_sk in (
        select
          item_sk
        from
          frequent_ss_items
      )
      and ws_bill_customer_sk in (
        select
          c_customer_sk
        from
          best_ss_customer
      )
      and ws_bill_customer_sk = c_customer_sk
    group by
      c_last_name,
      c_first_name
  )
order by
  c_last_name,
  c_first_name,
  sales
LIMIT
  100;
