Sql server 什么t-sql查询会选择具有两种特定产品的客户

Sql server 什么t-sql查询会选择具有两种特定产品的客户,sql-server,tsql,combinations,Sql Server,Tsql,Combinations,我有一个包含custid和prodid的products表 我需要查询该表以确定有多少客户拥有特定的产品组合: 至少1个产品编号1 (2,3,4,5)中至少有1种产品 然后我需要能够列出该类别的客户 有人问了这个问题,但当我尝试推荐的解决方案时,我发现了一个错误: “USING”附近的语法不正确 代码: 提前谢谢 让我们从逻辑上看一下。若并没有那个么多的经验,我的第一反应就是加入具有特定标准的产品。问题是我最终会有多个记录,因此我需要汇总到一个客户: Select c.CustomerId

我有一个包含custid和prodid的products表

我需要查询该表以确定有多少客户拥有特定的产品组合:

  • 至少1个产品编号1
  • (2,3,4,5)中至少有1种产品
然后我需要能够列出该类别的客户

有人问了这个问题,但当我尝试推荐的解决方案时,我发现了一个错误:

“USING”附近的语法不正确

代码:


提前谢谢

让我们从逻辑上看一下。若并没有那个么多的经验,我的第一反应就是加入具有特定标准的产品。问题是我最终会有多个记录,因此我需要汇总到一个客户:

Select c.CustomerId
From Customer c
Join Product p on p.CustomerId = c.CustomerId
Where p.ProductId in (2, 3, 4, 5)
or p.ProductId = 1
显然,这是错误的,因为在更糟糕的情况下,它为我们提供了5条特定客户加入多达5个匹配产品的记录。如果目标是在满足两个标准的情况下获得一个记录,那么我们必须考虑如何“查看记录”。“查看记录”有三种常见方法:

  • 在select或where条件中使用类似于
    in
    exists
    子句的子查询,或者偶尔作为嵌套联接

  • 聚合查询。这有时需要一点创造力和解决问题的能力

  • 一个窗口函数,例如
    MAX()OVER(PARTITION BY…)

  • 当条件句时,
    情况可能与上述情况相结合

    如果你学习了以上所有的技巧,你将有一个更大的心理工具带开始创造性地解决这些问题。这个答案有点宽泛,可以尝试展示所有这些的例子,所以我只展示一个解决问题的例子

    存在子查询

    带有
    EXISTS
    的子查询检查子查询是否至少返回了一条记录,如果找到任何记录,
    EXISTS
    将返回true。因为结果没有实际使用,我们只关心是否至少有一条记录,所以在子查询的
    select
    中返回什么并不重要,所以我们只返回
    1

    Select c.CustomerId
    From Customer c
    Join Product p on p.CustomerId = c.CustomerId
    Where p.ProductId = 1
    
    仅当客户拥有ID=1的相关产品时,上述操作返回的记录不超过一条。下面添加了其他标准,以消除至少一条其他产品记录不存在的记录:

    Select c.CustomerId
    From Customer c
    Join Product p on p.CustomerId = c.CustomerId
    Where p.ProductId = 1
      AND EXISTS
       (Select 1 From Product p2
        Where p2.ProductId in (2, 3, 4, 5)
          AND p2.CustomerId = c.CustomerId )
    
    这是最终的解决方案。请注意,我们只在子查询中找到相关记录是很重要的。要实现这一点,外部查询中的一个或多个条件与内部查询匹配是非常常见的。在本例中,我们使用外部查询中的
    c.CustomerID
    ,以及
    p2.CustomerID
    来缩小内部查询的结果范围

    已更新为自动加入:

    SELECT DISTINCT p1.CustomerId
      FROM Products p1
      JOIN Products p2 on p1.CustomerId = p2.CustomerId
     WHERE p1.ProductId = 1 
       AND p2.ProductId in (2, 3, 4, 5)
    

    听起来好像您在错误的位置使用了
    语句。显示您的尝试?在上面的示例中添加了它。使用is MySQL语法,您需要遵循TSQL语法进行连接:
    来自Production.Product AS p internal JOIN Sales.SalesOrderDetail AS sod ON p.ProductID=sod.ProductID
    ,不幸的是,我无法将您的示例转换为我的情况。下面是我的尝试,它在custrate.t1和custrate.t2上返回了无效的对象名。选择COUNT(不同的t1.custid)作为用户计数,从custrate.t1作为p内部连接custrate.t2作为p.custid=sod.custid上的sod,其中t1.rgid=333和t2.rgid in(321、325、329、345、360、364)我一直在产品上获取无效的对象名。。。我们说的是一张桌子,对吗?没有两个表(客户和产品)。@XiVix在这种情况下,我更新了问题,添加了一个自联接查询。在最初的问题中,您说“我有一个products表”,但您的错误表明您没有名为“products”的表。我假设您能够交换出表名以匹配您的特定模式。这很有效。我以为您在考虑两个表,但我不能确定,因为您的查询太高级了。我最初的问题只列出了一个表,但我不能指责你遗漏了这一点,因为你是一个SQL天才。谢谢是的,我可以交换名字。
    SELECT DISTINCT p1.CustomerId
      FROM Products p1
      JOIN Products p2 on p1.CustomerId = p2.CustomerId
     WHERE p1.ProductId = 1 
       AND p2.ProductId in (2, 3, 4, 5)