mysql 中统计当月购卡的客户数 和 重复购卡的客户数 以及 不在同一天购卡的客户数 写在同一个sql中
时间: 2024-09-18 13:06:09 浏览: 33
在MySQL中,统计当月购卡的客户数、重复购卡的客户数以及不在同一天购卡的客户数可以使用联合查询和一些条件组合。假设我们有一个名为`card_sales`的表,其中包含`customer_id`(客户ID)、`purchase_date`(购买日期)和`card_type`(卡片类型)字段。以下是可能的SQL语句:
```sql
SELECT
COUNT(DISTINCT customer_id) AS unique_monthly_customers,
(SELECT COUNT(customer_id)
FROM card_sales cs2
WHERE cs2.customer_id = cs1.customer_id AND MONTH(purchase_date) = MONTH(NOW()) - 1
GROUP BY customer_id HAVING COUNT(*) > 1) AS repeat_purchases,
(SELECT COUNT(customer_id)
FROM (
SELECT DISTINCT customer_id, purchase_date
FROM card_sales cs1
JOIN (
SELECT customer_id, purchase_date, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY purchase_date) as row_num
FROM card_sales
WHERE MONTH(purchase_date) = MONTH(NOW())
) cs2 ON cs1.customer_id = cs2.customer_id AND cs1.row_num <> cs2.row_num + 1
) subquery) AS different_days_purchases
FROM
card_sales cs1
WHERE
MONTH(purchase_date) = MONTH(NOW());
```
这个SQL做了以下几件事:
1. `unique_monthly_customers`计算了当月购卡的不同客户数。
2. `repeat_purchases`通过子查询找出在同一月份有重复购买记录的客户数。
3. `different_days_purchases`通过窗口函数ROW_NUMBER()和自连接找到不在同一天购卡的客户数。
注意,这个SQL假设`purchase_date`是一个日期时间类型,并且MySQL的MONTH()函数可以根据日期提取月份。如果你的数据表结构不同或使用其他数据库系统,可能会需要调整这个查询。
阅读全文