2015-04-01 69 views
0

我有一個產品表與custid和prodid。什麼t-sql查詢將選擇具有兩個特定產品的客戶

我需要查詢表,以確定有多少客戶有特定的產品組合:

  • 至少1產品數1
  • 至少1個產品(2,3,4,5)

然後我需要能夠列出該類別的客戶。

這個問題被問here但是當我試圖推薦的解決方案我得到錯誤:

Incorrect syntax near 'USING'.

代碼:

SELECT 
    COUNT(DISTINCT t1.custid) AS user_count 
FROM 
    custrate t1 
JOIN 
    custrate t2 USING (custid) 
WHERE 
    t1.rgid = 333 
    AND t2.rgid in (321, 325, 329, 345, 360, 364) 

在此先感謝。

+0

聽起來像是你有錯地方了'USING'聲明。顯示你的嘗試? – AaronLS 2015-04-01 23:14:26

+0

在上面的示例中添加了它 – 2015-04-01 23:28:48

+1

該USING是MySQL語法,您需要遵循連接的TSQL語法:'FROM Production.Product AS p INNER JOIN Sales.SalesOrderDetail AS sod ON p.ProductID = sod.ProductID' – AaronLS 2015-04-01 23:30:48

回答

2

讓我們通過這個邏輯。由於經驗不足,我的第一本能就是加入具有特定標準的產品。問題是,我想最終的多條記錄,所以我需要向下聚集的客戶:

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個匹配的產品。如果只有滿足BOTH條件才能獲得單個記錄,那麼我們必須考慮如何「查看記錄」。有以「看着對面的記錄」三種常用的方法:

  1. 子查詢,無論是在選擇,或在其中使用的東西像inexists條款的標準,或者偶爾的嵌套連接。

  2. 聚合查詢。這有時需要一點創意和解決問題。

  3. 窗函數如MAX() OVER (PARTITION BY...)

可能與上面會CASE WHEN條件語句相結合。

如果您瞭解了上述所有技巧,您將擁有更大的智力工具帶,以開始創造性地解決這些問題。這個答案有點寬泛,試圖展示所有這些的例子,所以我只展示一個解決你的問題的例子。

EXISTS子查詢

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

我一直在Product上得到無效的對象名...我們正在談論單個表的權利?沒有兩個表格(客戶和產品)。 – 2015-04-01 23:51:30

+0

@XiVix在這種情況下,我已經更新了這個問題,爲自加入添加了一個查詢。在您的原始問題中,您說「我有產品表」,但是您的錯誤表明您沒有名爲「產品」的表。我假設你能夠交換表名以匹配你的特定模式。 – AaronLS 2015-04-02 00:48:42

+0

工作。我以爲你在考慮兩張桌子,但我無法確定,因爲你的查詢是如此先進。我原來的問題確實陳述了一張表,但是我不能因爲錯過這些信息而選擇你,因爲你是一位SQL天才。謝謝。是的,我可以換出名字。 – 2015-04-02 01:00:52