3

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

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

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

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

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

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

5 回答 5

2

这是一种方法:

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
    )
于 2013-04-15T17:43:26.910 回答
2

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

因此,以下查询应返回您想要的内容:

select product, client, MAX(region) as region
from pcr
group by product, client
having COUNT(*) = 1
于 2013-04-15T18:34:40.853 回答
1

我已经根据您在问题中提供的信息在我构建的表格上测试了以下代码。我选择了一组产品,其中区域列同时包含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") 
于 2013-04-15T18:49:47.483 回答
0

如果您不关心哪个区域,则以下内容应该可以工作,至少在 mysql 中可以让您稍微滥用组。

select product, client, count(*) cnt from blah where cnt = 1 group by product, client
于 2013-04-15T17:25:29.587 回答
0

如果使用 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小提琴

于 2013-04-15T17:41:20.247 回答