2015-06-14 217 views
0

我有一個客戶表,項目表,並以下列的事務表計數功能計數所有行SQL如果條件滿足

交易 - ID,客戶ID(外鍵的客戶(ID)),項目ID(外鍵編號(ID))

使用此查詢,任何人可以幫助我創建一個查詢來回答以下問題:

如果某個特定客戶參與了涉及給定ItemID的交易(即,客戶購買了一個特定的項目),返回客戶參與的交易總數的計數。這個技巧(以及我自己無法解決的部分)是如何在不涉及ItemID用於查詢中。

+3

顯示你對解決方案的努力很有禮貌。 –

回答

2

您可以分兩步解決這個問題:

  1. 編寫返回有關客戶ID的查詢。如果您將該查詢寫爲子查詢或CTE(公用表表達式,即WITH子句),則甚至不需要將結果放在臨時表中。

  2. 將來自(1)的結果表加入交易表(篩選出您不感興趣的所有交易),然後按客戶ID分組(以便您可以使用SELECT子句中的聚合函數) ,並選擇COUNT(DISTINCT TransactionId)

東西沿着這些路線:

WITH relevantCustomers (CustomerId) AS 
(
    SELECT DISTINCT CustomerId 
    FROM Transactions 
    WHERE ItemId = 123 
) 
SELECT t.CustomerId, COUNT(DISTINCT t.TransactionId) 
FROM Transactions t 
INNER JOIN relevantCustomers rc ON t.CustomerId = rc.CustomerId 
GROUP BY t.CustomerId 

這給你一個集合中的所有客戶(通過其ID)購買了123項,與交易的每一個這些總數一起。

如果您只對一個特定客戶感興趣,可以將WHERE子句添加到通過該客戶ID進行過濾的「外部」查詢。

0
select count(*) from Transaction where CustID in (select CustID from Transaction where CustID = 123 and ItemID = 456) 

如果客戶123尚未參與交易的項目456,那麼該查詢將返回0的計數,因爲子查詢中,它沒有客戶ID條目。

+0

嗨吉姆,這是接近答案,但我正在尋找一種方法來實現你沒有在嵌套的select語句中指定custID。 –

+1

在這種情況下,我認爲stakx的答案就是你要找的。 –

+0

@MarkD,你想避免嵌套select語句的原因是什麼? – jarlh

0

對於「如果某個特定的客戶參與了涉及給定項ID交易」 - 你的意思是你有客戶ID和產品ID。如果是這樣的話,你可以只寫 -

SELECT * FROM TRANSACTION 
where CUSTID={"your customer id"} 
and ItemID = {"Required Item ID"} ; 

對於第二部分,你可以嘗試這樣的事:

Select count(*) from TRANSACTION 
where CUSTID={"your customer id"} 
and ItemID = {"Required Item ID"} ; 

可以隨意修改SQL查詢here瞭解SQL更好。

問候 Paritosh

0

謝謝吉姆 提醒我有關的地方在哪裏IN(嵌套查詢)讓我在正確的軌道上。

我想出瞭如下回答我的問題:

SELECT Name, Count(Name) 
FROM customer c 
JOIN transaction t 
ON c.ID = t.CustID 
WHERE CustID IN (SELECT CustID 
FROM transaction 
WHERE ItemID = 2); 

道歉Stakx,我一直在尋找在你明明提供一個同時的答案。

+0

我可能會誤解,但我懷疑這隻適用於最多隻能由一位顧客購買商品的情況。如果有幾個顧客可以購買同一件商品,那麼'COUNT(...)'不會區分它們。請注意這一點。無論哪種情況,如果您找到適合您的解決方案,我很高興! – stakx