【问题标题】:SQL: count customer that never bought a product, in a group bySQL:按组计算从未购买过产品的客户
【发布时间】:2017-03-17 08:33:41
【问题描述】:

我只有这个 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

事实上,ID 为 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 行。为什么我无法访问子查询中的值?

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

【问题讨论】:

  • 给出样本数据和预期结果。
  • 从这个表中,你可以得到每个产品曾经购买过的客户数量。如果您想获得从未购买过的人,您应该告诉我们您将客户存放在哪里。还是所有客户都在此表中?
  • @Forward,谢谢你的回复。所有客户都在此表中。我将在问题中添加此信息
  • 那么您的预期结果在哪里?第二个?

标签: mysql


【解决方案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

【讨论】:

  • 谢谢!正如预期的那样,在 sqlfiddle 中工作正常。但在我的 MySQL 上,它给了我错误:Error Code: 1055. Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 't.cus_num' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多