tolord

ratings view

Dec 4th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  WITH grouped_orders AS (
  2.  SELECT order_item.pizza,
  3.     sum(order_item.count) AS dow_sold,
  4.     sum(pizza.price * order_item.count::numeric * (1::numeric - customer.discount / 100::numeric)) AS dow_profit,
  5.     pizza.price,
  6.     date_part('dow'::text, "order".date) AS week
  7.    FROM "order"
  8.      JOIN order_item ON "order".id = order_item.order_id
  9.      JOIN pizza ON order_item.pizza = pizza.name
  10.      JOIN customer ON "order".customer = customer.phone_number
  11.   WHERE "order".status = 'выполнен'::order_status
  12.   GROUP BY order_item.pizza, pizza.price, (date_part('dow'::text, "order".date))
  13. ), total_profit AS (
  14.  SELECT grouped_orders.pizza,
  15.     sum(grouped_orders.dow_sold) AS total_sold,
  16.     sum(grouped_orders.dow_profit) AS total_profit
  17.    FROM grouped_orders
  18.   GROUP BY grouped_orders.pizza
  19. ), pizzas_with_rank AS (
  20.  SELECT total_profit.pizza,
  21.     total_profit.total_sold,
  22.     total_profit.total_profit,
  23.     row_number() OVER (ORDER BY total_profit.total_sold DESC) AS rank_by_count,
  24.     row_number() OVER (ORDER BY total_profit.total_profit DESC) AS rank_by_profit
  25.    FROM total_profit
  26. ), rating AS (
  27.  SELECT DISTINCT grouped_orders.pizza,
  28.     grouped_orders.price,
  29.     pizzas_with_rank.total_sold,
  30.     pizzas_with_rank.rank_by_count,
  31.     pizzas_with_rank.rank_by_profit,
  32.     first_value(grouped_orders.week) OVER (PARTITION BY grouped_orders.pizza ORDER BY grouped_orders.dow_sold DESC) AS popular_dow
  33.    FROM grouped_orders
  34.      JOIN pizzas_with_rank USING (pizza)
  35. )
  36. CREATE VIEW ratings AS
  37. SELECT
  38.     rating.pizza,
  39.     rating.price,
  40.     rating.total_sold,
  41.     rating.rank_by_count,
  42.     rating.rank_by_profit,
  43.     (ARRAY[
  44.         'Monday'::text,
  45.         'Tuesday'::text, 'Wednesday'::text, 'Thursday'::text, 'Friday'::text, 'Saturday'::text, 'Sunday'::text])[rating.popular_dow] AS most_popular_dow
  46. FROM rating;
Advertisement
Add Comment
Please, Sign In to add comment