q14b.sql 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. WITH cross_items AS
  2. (SELECT i_item_sk ss_item_sk
  3. FROM item,
  4. (SELECT
  5. iss.i_brand_id brand_id,
  6. iss.i_class_id class_id,
  7. iss.i_category_id category_id
  8. FROM store_sales, item iss, date_dim d1
  9. WHERE ss_item_sk = iss.i_item_sk
  10. AND ss_sold_date_sk = d1.d_date_sk
  11. AND d1.d_year BETWEEN 1999 AND 1999 + 2
  12. INTERSECT
  13. SELECT
  14. ics.i_brand_id,
  15. ics.i_class_id,
  16. ics.i_category_id
  17. FROM catalog_sales, item ics, date_dim d2
  18. WHERE cs_item_sk = ics.i_item_sk
  19. AND cs_sold_date_sk = d2.d_date_sk
  20. AND d2.d_year BETWEEN 1999 AND 1999 + 2
  21. INTERSECT
  22. SELECT
  23. iws.i_brand_id,
  24. iws.i_class_id,
  25. iws.i_category_id
  26. FROM web_sales, item iws, date_dim d3
  27. WHERE ws_item_sk = iws.i_item_sk
  28. AND ws_sold_date_sk = d3.d_date_sk
  29. AND d3.d_year BETWEEN 1999 AND 1999 + 2) x
  30. WHERE i_brand_id = brand_id
  31. AND i_class_id = class_id
  32. AND i_category_id = category_id
  33. ),
  34. avg_sales AS
  35. (SELECT avg(quantity * list_price) average_sales
  36. FROM (SELECT
  37. ss_quantity quantity,
  38. ss_list_price list_price
  39. FROM store_sales, date_dim
  40. WHERE ss_sold_date_sk = d_date_sk AND d_year BETWEEN 1999 AND 1999 + 2
  41. UNION ALL
  42. SELECT
  43. cs_quantity quantity,
  44. cs_list_price list_price
  45. FROM catalog_sales, date_dim
  46. WHERE cs_sold_date_sk = d_date_sk AND d_year BETWEEN 1999 AND 1999 + 2
  47. UNION ALL
  48. SELECT
  49. ws_quantity quantity,
  50. ws_list_price list_price
  51. FROM web_sales, date_dim
  52. WHERE ws_sold_date_sk = d_date_sk AND d_year BETWEEN 1999 AND 1999 + 2) x)
  53. SELECT *
  54. FROM
  55. (SELECT
  56. 'store' channel,
  57. i_brand_id,
  58. i_class_id,
  59. i_category_id,
  60. sum(ss_quantity * ss_list_price) sales,
  61. count(*) number_sales
  62. FROM store_sales, item, date_dim
  63. WHERE ss_item_sk IN (SELECT ss_item_sk
  64. FROM cross_items)
  65. AND ss_item_sk = i_item_sk
  66. AND ss_sold_date_sk = d_date_sk
  67. AND d_week_seq = (SELECT d_week_seq
  68. FROM date_dim
  69. WHERE d_year = 1999 + 1 AND d_moy = 12 AND d_dom = 11)
  70. GROUP BY i_brand_id, i_class_id, i_category_id
  71. HAVING sum(ss_quantity * ss_list_price) > (SELECT average_sales
  72. FROM avg_sales)) this_year,
  73. (SELECT
  74. 'store' channel,
  75. i_brand_id,
  76. i_class_id,
  77. i_category_id,
  78. sum(ss_quantity * ss_list_price) sales,
  79. count(*) number_sales
  80. FROM store_sales, item, date_dim
  81. WHERE ss_item_sk IN (SELECT ss_item_sk
  82. FROM cross_items)
  83. AND ss_item_sk = i_item_sk
  84. AND ss_sold_date_sk = d_date_sk
  85. AND d_week_seq = (SELECT d_week_seq
  86. FROM date_dim
  87. WHERE d_year = 1999 AND d_moy = 12 AND d_dom = 11)
  88. GROUP BY i_brand_id, i_class_id, i_category_id
  89. HAVING sum(ss_quantity * ss_list_price) > (SELECT average_sales
  90. FROM avg_sales)) last_year
  91. WHERE this_year.i_brand_id = last_year.i_brand_id
  92. AND this_year.i_class_id = last_year.i_class_id
  93. AND this_year.i_category_id = last_year.i_category_id
  94. ORDER BY this_year.channel, this_year.i_brand_id, this_year.i_class_id, this_year.i_category_id
  95. LIMIT 100