SQL:计算从未购买过产品的客户

时间:2017-03-17 08:33:42

标签: mysql

我有这个MySQL表: Order(customer_id, wine_id, price)

一个例子

wine_id |   customer_id |   price
1       |   1           |   13€
1       |   2           |   13€
1       |   3           |   13€
2       |   1           |   17€
2       |   3           |   16€
3       |   4           |   15€
3       |   2           |   15€

并希望获得每个产品从未购买过产品的客户数量。

因此有3种葡萄酒和4种顾客。这张桌子上的所有顾客至少买了一瓶葡萄酒。 在上面的示例中,我期望以下内容:

wine_id |   count(distinct customer)
1       |   1
2       |   2
3       |   2

事实上, 1 的葡萄酒已经 3 客户从 4 总客户那里购买了......所以我想要从未购买过预期结果的客户 1

我想到了这个:

SELECT 
    o1.wine_id,
    COUNT(DISTINCT o1.customer_id) 
FROM
    order o1
WHERE
    customer_id NOT IN (SELECT 
            o2.customer_id
        FROM
            order o2
        WHERE
            o2.wine_id = o1.wine_id)
GROUP BY o1.wine_id;

这个想法是让购买葡萄酒的顾客进入子查询,然后把它放在通过分组葡萄酒的where子句中。但显然这个假设有些不对劲。它返回0行。为什么我无法访问子查询中的值?

你能帮我解决一下这个问题吗?

1 个答案:

答案 0 :(得分:1)

试试这个:

select 
    wine_id,
    cus_num - count(distinct customer_id) never_bought_num
from yourtable
join (select count(distinct customer_id) as cus_num from yourtable) t
group by wine_id

请参阅sqlfiddle中的demo

在您的情况下,您应该计算表order中的所有客户,这是总数,然后减去购买产品的客户数量,您将从未购买数字。

<强> 修改 : 有两种方法可以解决你的sql错误 1)设置sql_modeonly_full_group_by;
2)将group by wine_id替换为group by wine_id, cus_num

为什么这个问题???

检查官方文档Server SQL Modes