Mysql SQL-选择在特定日期仅购买1种产品的客户
我需要知道2017-01-01有多少人在购买铅笔之前只购买了一种其他类型的产品。e、 g.事先只买笔记本 这就是我所拥有的,到目前为止,显示了许多人事先购买了一种产品,所以我缺少的是他们在2017-01-01上购买了多少支铅笔: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
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
);
我并没有真正检查它,但我希望您能理解——在本例中,它简化为两个步骤:一个是获取满足给定条件的客户子集,另一个是对满足给定条件的操作进行聚合。您应该显示示例数据或至少是示例数据布局。期望的结果也是有用的。缺少重要信息,例如日期字段和产品名称。不仅你理解我的问题,你还解决了它!非常感谢你。我不得不玩它,因为我需要一些稍微不同的东西,但这真的很有帮助!谢谢戈登!