【问题标题】:SQL Statement to Compare rows用于比较行的 SQL 语句
【发布时间】:2013-04-15 17:22:45
【问题描述】:

我有一个存储产品编号、客户名称和区域的表。因此,我可以使用这张表查询特定区域中特定客户的所有产品。

我正在尝试编写一个查询,让我可以查看客户在 1 个区域中拥有哪些产品,但在另一个区域中没有,反之亦然(比较区域)。换句话说,对于特定的客户,我是否可以看到北方的所有产品而不是南方的所有产品,以及南方的所有产品而不是北方的所有产品。

我很确定如果它是 2 个单独的查询,这将非常容易,但我试图在一个查询中完成。有可能吗?

产品客户区域 500 1 北 500 1 南 501 1 北 502 1 南 503 1 北 503 1 南

上述数据的结果表明,客户 1 在北方有产品 501,但在南方没有,在南方有产品 502,但在北方没有。产品 500 和 503 被忽略,因为它们位于两个区域中。

产品客户区域 501 1 北 502 1 南

【问题讨论】:

  • 您在寻找类似ORDER BY region 的东西吗?我不确定您认为如何在单个查询中显示和隐藏数据。
  • 您使用的是什么数据库平台?
  • @dugas 在这种情况下应该无关紧要,因为有几个答案适用于所有主要产品。

标签: sql join compare


【解决方案1】:

这是一种方法:

Select product, client, region
From yourTable t
Where region in('north','south')
  And not exists(
    Select product, client, region
    From yourTable tt
    Where t.region <> tt.region
      And t.client = tt.client
      And t.product = tt.product
    )

【讨论】:

    【解决方案2】:

    如果客户在两个地区都有产品,则有两行(假设没有重复)。如果只有一个地区有产品,则计数为 1。

    所以,下面的查询应该返回你想要的:

    select product, client, MAX(region) as region
    from pcr
    group by product, client
    having COUNT(*) = 1
    

    【讨论】:

    • 我认为这是最简单(也可能是最好)的答案。我推迟发布它,因为其他几个响应者很接近,我认为他们可能会更正他们对此的答案。
    【解决方案3】:

    我已经在根据您在问题中提供的信息构建的表格上测试了以下代码。我选择了一组产品,其中区域列同时包含North South;从这里我从没有出现Product 的结果集中获取数据(这意味着它不包含NorthSouth

    结果:

    产品客户地区 501 1 北 502 1 南

    查询:

    SELECT * 
    FROM   test 
    WHERE  product NOT IN(SELECT t1.product 
                          FROM   test t1 
                                 INNER JOIN test t2 
                                         ON t1.product = t2.product 
                          WHERE  t1.region = "North" 
                                 AND t2.region = "South") 
    

    【讨论】:

      【解决方案4】:

      如果您不关心 WHICH 区域,以下应该可以工作,至少在 mysql 中可以让您稍微滥用 group。

      select product, client, count(*) cnt from blah where cnt = 1 group by product, client
      

      【讨论】:

      • 示例输出中确实有区域。通过一些更改,此查询既可以满足该需求,又可以与大多数 SQL 产品兼容。
      【解决方案5】:

      如果使用 MSSQL > 2005,这应该适合您:

      SELECT pvt.Product, pvt.Client, [NORTH],[SOUTH]
      FROM
      (SELECT Product, Client, Region
      FROM ProductTable) p
      PIVOT
      (
      COUNT (Region)
      FOR Region IN([NORTH],[SOUTH])
      ) pvt
      WHERE ([NORTH]+[SOUTH]) <> 2
      

      SQL Fiddle

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-04
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 2016-12-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多