Mysql SQL-选择在特定日期仅购买1种产品的客户

Mysql SQL-选择在特定日期仅购买1种产品的客户,mysql,sql,join,count,distinct,Mysql,Sql,Join,Count,Distinct,我需要知道2017-01-01有多少人在购买铅笔之前只购买了一种其他类型的产品。e、 g.事先只买笔记本 这就是我所拥有的,到目前为止,显示了许多人事先购买了一种产品,所以我缺少的是他们在2017-01-01上购买了多少支铅笔: SELECT c.name, s.units_sold AS Sold, s.product_id FROM sales AS s INNER JOIN customers AS c ON c.id=s.customer_id GROUP BY c.name H

我需要知道2017-01-01有多少人在购买铅笔之前只购买了一种其他类型的产品。e、 g.事先只买笔记本 这就是我所拥有的,到目前为止,显示了许多人事先购买了一种产品,所以我缺少的是他们在2017-01-01上购买了多少支铅笔:

SELECT 
c.name, 
s.units_sold AS Sold,
s.product_id

FROM 
sales AS s
INNER JOIN customers AS c
ON c.id=s.customer_id
GROUP BY c.name
HAVING COUNT(DISTINCT s.product_id) = 1
我试图研究类似的问题,但没有成功。 希望我的问题很清楚:/


谢谢

这似乎是一个非常奇怪的问题。但如果我逐字读的话,你似乎想要这样的东西:

select sum(s.units_sold)
from sales s
where s.product_id = 'pencil' and
      s.date = '2017-01-01' and
      1 = (select count(distinct s2.product_id)
           from sales s2 
           where s2.customer_id = s.customer_id and 
                 s2.date < s.date
          );

Gordon的查询是合法的,尽管它似乎有一个缺陷:它执行子查询的次数与客户数量相同。 太重了

请记住,SQL是一种声明性语言,因此您不会告诉引擎它应该如何做,只需声明您需要的内容即可

因此,可以这样思考:

我需要对客户子集运行聚合查询。 所以我首先要确定这个子集:那些只购买过一次的人;除铅笔外的任何产品;在给定日期之前 一旦我有了这组客户,我就可以解决他们的购买问题:确切地说是铅笔;正好在给定的日期 这里,在第一次迭代中!,你的问题变得很明显我将使用Gordon的符号:

SELECT sum(s.units_sold)
FROM sales s
WHERE s.product_id = 'pencil' AND
      s.date = '2017-01-01' AND
      s.customer_id IN (
          SELECT s2.customer_id
          FROM sales s2
          WHERE s2.date < '2017-01-01'
          GROUP BY s2.customer_id
          HAVING count(DISTINCT s2.product_id) = 1
      );

我并没有真正检查它,但我希望您能理解——在本例中,它简化为两个步骤:一个是获取满足给定条件的客户子集,另一个是对满足给定条件的操作进行聚合。

您应该显示示例数据或至少是示例数据布局。期望的结果也是有用的。缺少重要信息,例如日期字段和产品名称。不仅你理解我的问题,你还解决了它!非常感谢你。我不得不玩它,因为我需要一些稍微不同的东西,但这真的很有帮助!谢谢戈登!