【问题标题】:SQL - Selecting a customer that only bought 1 type of product on a specific dateSQL - 选择在特定日期仅购买一种产品的客户
【发布时间】:2017-06-18 23:24:39
【问题描述】:

我需要了解在 2017 年 1 月 1 日购买 铅笔 之前只购买了 1 种其他类型产品的人购买了多少 铅笔。 (例如,事先只购买笔记本) 这就是我所拥有的,到目前为止显示许多人事先购买了一种产品,所以我缺少的是他们在 2017 年 1 月 1 日购买了多少 铅笔

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

我试图查看类似的问题但没有成功。 希望我的问题很清楚:/

谢谢!

【问题讨论】:

  • 您应该显示示例数据或至少显示示例数据布局。期望的结果也很有用。缺少重要信息,例如日期字段和产品名称。

标签: mysql sql join count distinct


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

【讨论】:

  • 您不仅理解了我的问题,而且成功了!太感谢了。我不得不玩弄它,因为我需要一些稍微不同的东西,但这真的很有帮助!谢谢戈登!
【解决方案2】:

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

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

因此,可以这样考虑:

  1. 我需要对客户子集运行聚合查询。
  2. 所以我要先确定这个子集:那些只有一次购买的人;铅笔以外的任何产品;在给定日期之前
  3. 一旦我有了这组客户,我就可以解决他们购买的问题:确切地说是铅笔;正好在给定日期

在这里,在第一次迭代 (!) 中,您的查询变得非常明显(我将使用 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
      );

我并没有真正检查它,但我希望你明白 - 在这种情况下,它被简化为两遍:一是获取满足给定条件的客户子集,二是进行聚合满足给定条件的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2017-11-03
    • 2016-10-01
    • 2022-07-11
    相关资源
    最近更新 更多