WITH tb AS (
SELECT
item.order_id,
SUM(item.price) AS ord_amt,
COUNT(item.order_item_id) AS prd_cnt
FROM `olist.olist_order_items` AS item
GROUP BY item.order_id
)
, base AS (
SELECT
DATE(ord.order_approved_at) as ord_date,
ord.order_id,
ord.customer_id,
cust.customer_unique_id,
tb.ord_amt,
tb.prd_cnt
FROM `olist.olist_orders` AS ord
LEFT JOIN `olist.olist_customers` AS cust
ON ord.customer_id = cust.customer_id
INNER JOIN tb
ON ord.order_id = tb.order_id
WHERE 1=1
AND order_status IN ('delivered', 'shipped')
AND order_approved_at IS NOT NULL
)
SELECT
ord_date,
ROUND(SUM(ord_amt), 2) AS ord_amt,
COUNT(DISTINCT order_id) AS ord_cnt,
SUM(prd_cnt) AS prd_cnt,
ROUND(IFNULL(SAFE_DIVIDE(SUM(ord_amt), COUNT(DISTINCT order_id)), 0), 2) AS avg_ord_amt,
ROUND(IFNULL(SAFE_DIVIDE(SUM(prd_cnt), COUNT(DISTINCT order_id)), 0), 2) AS avg_prd_cnt,
ROUND(IFNULL(SAFE_DIVIDE(SUM(ord_amt), SUM(prd_cnt)), 0), 2) AS avg_price,
COUNT(DISTINCT customer_unique_id) AS cust_cnt,
ROUND(IFNULL(SAFE_DIVIDE(COUNT(DISTINCT order_id), COUNT(DISTINCT customer_unique_id)), 0), 2) AS cust_freq
FROM base
GROUP BY ord_date
ORDER BY ord_date