我必须创建一个 SQL 查询,显示过去 90 天内的活动用户、不活动的用户,以及不活动用户的百分比(不活动/所有用户)。我有两个不同的表:订单(order_id、customer_id、order_date、total)和 order_items(order_id、product_id、quantity、unit_price)。
我能够创建第一个字段(活动的和非活动的),但是是分开的。
我尝试合并两个查询,但结果导致条目重复。
此外,仍然不确定如何获得该百分比字段,因为我只能分别处于活动状态和非活动状态。
SELECT order_items.product_id, COUNT(orders.customer_id) AS active_cust
FROM orders
JOIN order_items
ON orders.order_id = order_items.order_id
WHERE orders.order_date >= CURRENT_DATE - INTERVAL '90 day'
GROUP BY order_items.product_id;
SELECT order_items.product_id, COUNT(orders.customer_id) AS inactive_cust
FROM orders
JOIN order_items
ON orders.order_id = order_items.order_id
WHERE orders.order_date <= CURRENT_DATE - INTERVAL '90 day'
GROUP BY order_items.product_id;
SELECT * FROM
(SELECT order_items.product_id, COUNT(orders.customer_id) AS active_cust
FROM orders
JOIN order_items
ON orders.order_id = order_items.order_id
WHERE orders.order_date >= CURRENT_DATE - INTERVAL '90 day'
GROUP BY order_items.product_id
) AS q1,
(SELECT COUNT(orders.customer_id) AS inactive_cust
FROM orders
JOIN order_items
ON orders.order_id = order_items.order_id
WHERE orders.order_date <= CURRENT_DATE - INTERVAL '90 day'
GROUP BY order_items.product_id
) AS q2
GROUP BY product_id, q1.active_cust, q2.inactive_cust
ORDER BY product_id;
您需要的技巧是过滤聚合,例如:
SELECT order_items.product_id,
COUNT(orders.customer_id) FILTER (WHERE orders.order_date >= CURRENT_DATE - 90) AS active_cust,
COUNT(orders.customer_id) FILTER (WHERE orders.order_date < CURRENT_DATE - 90) AS inactive_cust
FROM orders
JOIN order_items
ON orders.order_id = order_items.order_id
GROUP BY order_items.product_id;
请注意,由于内部联接,相同的
customer_id
可能会出现多次。如果您只想计算不同的 customer_id
,请使用 COUNT(DISTINCT ...)
。