-- SQLBench-DS query 77 derived from TPC-DS query 77 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
  ss as (
    select
      s_store_sk,
      sum(ss_ext_sales_price) as sales,
      sum(ss_net_profit) as profit
    from
      store_sales,
      date_dim,
      store
    where
      ss_sold_date_sk = d_date_sk
      and d_date between cast('2001-08-11' as date) and (cast('2001-08-11' as date) + INTERVAL '30 DAYS')
      and ss_store_sk = s_store_sk
    group by
      s_store_sk
  ),
  sr as (
    select
      s_store_sk,
      sum(sr_return_amt) as returns,
      sum(sr_net_loss) as profit_loss
    from
      store_returns,
      date_dim,
      store
    where
      sr_returned_date_sk = d_date_sk
      and d_date between cast('2001-08-11' as date) and (cast('2001-08-11' as date) + INTERVAL '30 DAYS')
      and sr_store_sk = s_store_sk
    group by
      s_store_sk
  ),
  cs as (
    select
      cs_call_center_sk,
      sum(cs_ext_sales_price) as sales,
      sum(cs_net_profit) as profit
    from
      catalog_sales,
      date_dim
    where
      cs_sold_date_sk = d_date_sk
      and d_date between cast('2001-08-11' as date) and (cast('2001-08-11' as date) + INTERVAL '30 DAYS')
    group by
      cs_call_center_sk
  ),
  cr as (
    select
      cr_call_center_sk,
      sum(cr_return_amount) as returns,
      sum(cr_net_loss) as profit_loss
    from
      catalog_returns,
      date_dim
    where
      cr_returned_date_sk = d_date_sk
      and d_date between cast('2001-08-11' as date) and (cast('2001-08-11' as date) + INTERVAL '30 DAYS')
    group by
      cr_call_center_sk
  ),
  ws as (
    select
      wp_web_page_sk,
      sum(ws_ext_sales_price) as sales,
      sum(ws_net_profit) as profit
    from
      web_sales,
      date_dim,
      web_page
    where
      ws_sold_date_sk = d_date_sk
      and d_date between cast('2001-08-11' as date) and (cast('2001-08-11' as date) + INTERVAL '30 DAYS')
      and ws_web_page_sk = wp_web_page_sk
    group by
      wp_web_page_sk
  ),
  wr as (
    select
      wp_web_page_sk,
      sum(wr_return_amt) as returns,
      sum(wr_net_loss) as profit_loss
    from
      web_returns,
      date_dim,
      web_page
    where
      wr_returned_date_sk = d_date_sk
      and d_date between cast('2001-08-11' as date) and (cast('2001-08-11' as date) + INTERVAL '30 DAYS')
      and wr_web_page_sk = wp_web_page_sk
    group by
      wp_web_page_sk
  )
select
  channel,
  id,
  sum(sales) as sales,
  sum(returns) as returns,
  sum(profit) as profit
from
  (
    select
      'store channel' as channel,
      ss.s_store_sk as id,
      sales,
      coalesce(returns, 0) as returns,
      (profit - coalesce(profit_loss, 0)) as profit
    from
      ss
      left join sr on ss.s_store_sk = sr.s_store_sk
    union all
    select
      'catalog channel' as channel,
      cs_call_center_sk as id,
      sales,
      returns,
      (profit - profit_loss) as profit
    from
      cs,
      cr
    union all
    select
      'web channel' as channel,
      ws.wp_web_page_sk as id,
      sales,
      coalesce(returns, 0) returns,
      (profit - coalesce(profit_loss, 0)) as profit
    from
      ws
      left join wr on ws.wp_web_page_sk = wr.wp_web_page_sk
  ) x
group by
  rollup (channel, id)
order by
  channel,
  id
LIMIT
  100;
