WITH cross_items AS
  (SELECT i_item_sk ss_item_sk
   FROM item,
     (SELECT iss.i_brand_id brand_id,
             iss.i_class_id class_id,
             iss.i_category_id category_id
      FROM store_sales,
           item iss,
           date_dim d1
      WHERE ss_item_sk = iss.i_item_sk
        AND ss_sold_date_sk = d1.d_date_sk
        AND d1.d_year BETWEEN 1999 AND 1999 + 2 INTERSECT
        SELECT ics.i_brand_id,
               ics.i_class_id,
               ics.i_category_id
        FROM catalog_sales,
             item ics,
             date_dim d2 WHERE cs_item_sk = ics.i_item_sk
        AND cs_sold_date_sk = d2.d_date_sk
        AND d2.d_year BETWEEN 1999 AND 1999 + 2 INTERSECT
        SELECT iws.i_brand_id,
               iws.i_class_id,
               iws.i_category_id
        FROM web_sales,
             item iws,
             date_dim d3 WHERE ws_item_sk = iws.i_item_sk
        AND ws_sold_date_sk = d3.d_date_sk
        AND d3.d_year BETWEEN 1999 AND 1999 + 2) sq1
   WHERE i_brand_id = brand_id
     AND i_class_id = class_id
     AND i_category_id = category_id ),
     avg_sales AS
  (SELECT avg(quantity*list_price) average_sales
   FROM
     (SELECT ss_quantity quantity,
             ss_list_price list_price
      FROM store_sales,
           date_dim
      WHERE ss_sold_date_sk = d_date_sk
        AND d_year BETWEEN 1999 AND 1999 + 2
      UNION ALL SELECT cs_quantity quantity,
                       cs_list_price list_price
      FROM catalog_sales,
           date_dim
      WHERE cs_sold_date_sk = d_date_sk
        AND d_year BETWEEN 1999 AND 1999 + 2
      UNION ALL SELECT ws_quantity quantity,
                       ws_list_price list_price
      FROM web_sales,
           date_dim
      WHERE ws_sold_date_sk = d_date_sk
        AND d_year BETWEEN 1999 AND 1999 + 2) sq2)
SELECT channel,
       i_brand_id,
       i_class_id,
       i_category_id,
       sum(sales) AS sum_sales,
       sum(number_sales) AS sum_number_sales
FROM
  (SELECT 'store' channel,
                  i_brand_id,
                  i_class_id,
                  i_category_id,
                  sum(ss_quantity*ss_list_price) sales,
                  count(*) number_sales
   FROM store_sales,
        item,
        date_dim
   WHERE ss_item_sk IN
       (SELECT ss_item_sk
        FROM cross_items)
     AND ss_item_sk = i_item_sk
     AND ss_sold_date_sk = d_date_sk
     AND d_year = 1999+2
     AND d_moy = 11
   GROUP BY i_brand_id,
            i_class_id,
            i_category_id
   HAVING sum(ss_quantity*ss_list_price) >
     (SELECT average_sales
      FROM avg_sales)
   UNION ALL SELECT 'catalog' channel,
                              i_brand_id,
                              i_class_id,
                              i_category_id,
                              sum(cs_quantity*cs_list_price) sales,
                              count(*) number_sales
   FROM catalog_sales,
        item,
        date_dim
   WHERE cs_item_sk IN
       (SELECT ss_item_sk
        FROM cross_items)
     AND cs_item_sk = i_item_sk
     AND cs_sold_date_sk = d_date_sk
     AND d_year = 1999+2
     AND d_moy = 11
   GROUP BY i_brand_id,
            i_class_id,
            i_category_id
   HAVING sum(cs_quantity*cs_list_price) >
     (SELECT average_sales
      FROM avg_sales)
   UNION ALL SELECT 'web' channel,
                          i_brand_id,
                          i_class_id,
                          i_category_id,
                          sum(ws_quantity*ws_list_price) sales,
                          count(*) number_sales
   FROM web_sales,
        item,
        date_dim
   WHERE ws_item_sk IN
       (SELECT ss_item_sk
        FROM cross_items)
     AND ws_item_sk = i_item_sk
     AND ws_sold_date_sk = d_date_sk
     AND d_year = 1999+2
     AND d_moy = 11
   GROUP BY i_brand_id,
            i_class_id,
            i_category_id
   HAVING sum(ws_quantity*ws_list_price) >
     (SELECT average_sales
      FROM avg_sales)) y
GROUP BY ROLLUP (channel,
                 i_brand_id,
                 i_class_id,
                 i_category_id)
ORDER BY channel NULLS FIRST,
         i_brand_id NULLS FIRST,
         i_class_id NULLS FIRST,
         i_category_id NULLS FIRST
LIMIT 100;
