Mysql SQL:按组统计从未购买过产品的客户
我只有这个MySQL表:Mysql SQL:按组统计从未购买过产品的客户,mysql,Mysql,我只有这个MySQL表: 订单(客户id、葡萄酒id、价格) 一个例子 wine_id | customer_id | price 1 | 1 | 13€ 1 | 2 | 13€ 1 | 3 | 13€ 2 | 1 | 17€ 2 | 3 | 16€ 3 | 4
订单(客户id、葡萄酒id、价格)
一个例子
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
事实上,id为1的葡萄酒已被4位客户中的3位客户购买。。。因此,由于我想要的是从未购买过该产品的客户,因此预期结果为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行。为什么我不能访问子查询中的值
你们能帮我解答这个问题吗?试试这个:
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
看在小提琴里
在您的情况下,您应该统计表order
中的所有客户,这是总数,然后减去购买产品的客户数量,您将得到从未购买过的数量
编辑:
有两种方法可以解决sql错误。1) 设置您的
sql\u模式
,而不使用仅设置完整的组
2) 将
按葡萄酒id分组
替换为按葡萄酒id、数量分组
为什么会出现这个问题
查看官方文件。给出一个样本数据和预期结果。从该表中,您可以得到每种产品曾经购买过的客户数量。如果你想得到一个从未买过东西的人,你应该告诉我们你把你的顾客放在哪里。还是所有客户都在这张桌子上?@Forward,谢谢你的回复。所有的顾客都在这张桌子上。我会在问题中添加这些信息,那么你的预期结果是什么?第二个?谢谢!正如预期的那样,在sqlfiddle中工作良好。但是在我的MySQL上,它给了我一个错误:
error-code:1055。SELECT列表的表达式#2不在GROUP BY子句中,并且包含未聚合的列“t.cus_num”,该列在功能上不依赖于GROUP BY子句中的列;这与sql\u mode=only\u full\u group\u by不兼容