编写SQL脚本,仅基于订单数据表计算22年10月31日-22年11月11日活动期间新客和老客的购买人数、支付金额、各个品类及货品购买人数和购买金额;其中新客指22年10月30日前365天无购买行为消费者;老客指22年10月30日前365天有购买行为消费者,且在D11有购买行为
时间: 2024-01-24 18:17:36 浏览: 230
根据题目描述,我们需要对订单数据表进行筛选和计算。假设订单数据表名为orders,包含以下字段:
- order_id: 订单编号
- customer_id: 客户编号
- product_id: 商品编号
- category_id: 商品类别编号
- order_time: 下单时间
- payment: 支付金额
下面是SQL脚本:
```sql
-- 计算新客购买人数和支付金额
SELECT COUNT(DISTINCT o.customer_id) AS new_customer_num, SUM(o.payment) AS new_customer_payment
FROM orders o
LEFT JOIN (
-- 找到22年10月30日前有购买行为的客户编号
SELECT DISTINCT customer_id
FROM orders
WHERE order_time < '2022-10-30'
AND order_time >= DATEADD(day, -365, '2022-10-30')
) old_c ON o.customer_id = old_c.customer_id
WHERE o.order_time >= '2022-10-31'
AND o.order_time <= '2022-11-11'
AND old_c.customer_id IS NULL;
-- 计算老客购买人数和支付金额
SELECT COUNT(DISTINCT o.customer_id) AS old_customer_num, SUM(o.payment) AS old_customer_payment
FROM orders o
INNER JOIN (
-- 找到22年10月30日前有购买行为,且在D11有购买行为的客户编号
SELECT DISTINCT customer_id
FROM orders
WHERE order_time < '2022-10-30'
AND order_time >= DATEADD(day, -365, '2022-10-30')
AND EXISTS (
SELECT 1
FROM orders
WHERE customer_id = orders.customer_id AND order_time = '2022-11-11'
)
) old_c ON o.customer_id = old_c.customer_id
WHERE o.order_time >= '2022-10-31'
AND o.order_time <= '2022-11-11';
-- 计算各个品类和货品的购买人数和支付金额
SELECT category_id, product_id, COUNT(DISTINCT o.customer_id) AS customer_num, SUM(o.payment) AS payment
FROM orders o
LEFT JOIN (
-- 找到22年10月30日前有购买行为的客户编号
SELECT DISTINCT customer_id
FROM orders
WHERE order_time < '2022-10-30'
AND order_time >= DATEADD(day, -365, '2022-10-30')
) old_c ON o.customer_id = old_c.customer_id
WHERE o.order_time >= '2022-10-31'
AND o.order_time <= '2022-11-11'
AND old_c.customer_id IS NULL
GROUP BY category_id, product_id;
```
说明:
- 在第一条和第二条SQL语句中,我们使用了LEFT JOIN和INNER JOIN分别筛选出新客和老客,其中LEFT JOIN保留了没有匹配到老客的订单(即新客),而INNER JOIN只保留了匹配到老客的订单。
- 在第三条SQL语句中,我们使用了GROUP BY对商品类别和商品编号进行分组,然后计算每组的购买人数和支付金额。
- 在所有SQL语句中,我们使用了日期函数DATEADD和日期比较操作符来筛选出活动期间的订单和22年10月30日前的订单。
阅读全文