我有这个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行。为什么我无法访问子查询中的值?
你能帮我解决一下这个问题吗?
答案 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_mode
不only_full_group_by
;
2)将group by wine_id
替换为group by wine_id, cus_num
。
为什么这个问题???
检查官方文档Server SQL Modes。