2013-04-15 41 views
3

我有一張存儲產品號,客戶名稱和地區的表。因此,我可以使用這個單一表格查詢特定區域中特定客戶端的所有產品。用於比較行的SQL語句

我想寫一個查詢,這將允許我看到哪些產品的客戶端在1區域,但不是其他和反之亦然(比較區域)。換句話說,對於特定的客戶,我可以看到北方不是南方的所有產品,而南方的所有產品都不在北方?

我敢肯定,這將是非常容易的,如果它是2個單獨的查詢,但我試圖做一個單一的查詢。可能嗎?

 
Product   Client   Region 
500    1    North 
500    1    South 
501    1    North 
502    1    South 
503    1    North 
503    1    South 

結果上面的數據將表明,客戶端1有產品501在北方,而不是南方以及南方產品502而不是朝鮮。產品500和503由於在兩個區域中都被忽略。

 
Product   Client   Region 
501    1    North 
502    1    South 
+0

您是否在尋找像'ORDER BY region'?我不知道您如何在一個查詢中顯示和隱藏數據。 –

+0

您使用的是哪種數據庫平臺? – dugas

+0

@dugas在這種情況下應該無關緊要,因爲在所有主要產品中都有幾種答案。 – RBarryYoung

回答

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 
    ) 
+0

這對我有用!謝謝! –

-1

如果你不關心WHICH區域,至少在mysql中允許你濫用group。

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

示例輸出確實有區域。通過一些更改,這個查詢可以滿足這種需求並且與大多數SQL產品兼容。 – RBarryYoung

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 Fiddle

2

如果客戶在這兩個產品區域,那麼有兩行(假設沒有重複)。如果只有一個地區有產品,則計數爲1。

所以,下面的查詢應返回你想要什麼:

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

我認爲這是最簡單的(也可能是最好的)答案。我拒絕發佈它,因爲其他一些響應者已經接近,我認爲他們可能會糾正他們的答案。 – RBarryYoung

1

我桌子上測試下面的代碼,我建立了基於你在你的問題中提供的信息。我選擇了一組產品,其中地區欄包含NorthSouth;從這裏,我從結果集中在Product沒有出現(這意味着它不包含兩個NorthSouth取得的數據

結果:

 
product  client  Region 
501   1   North 
502   1   South 

查詢:

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")