2016-11-14 185 views
0

我想先解釋我的查詢應該做什麼。檢索滿足一定條件的行

在我的店裏,我們賣產品A,B,C和d(產品ID) 比方說,我感興趣的只是那些項目A出售

交易這是我寫我的查詢

Select [Transaction_No],[Product ID] 
from [MystoreDB$Transaction lines] 
where Date = '01-Jan-2016' 
and (Product ID) = 'A' 

查詢的執行沒有任何錯誤,我只得到過濾產品ID A.結果

但如果我真的期待到過濾交易,我可以看到,有在同買其它產品交易(產品B是博ught以及)

但查詢只過濾「行」與產品A

對於實例 有總在1月-2016做4個交易

事務1有 產品A + B

事務2有 產品A僅

事務3具有 產品A + C

交易4有 產品A僅

當時我想我的查詢檢索只有2個交易 到底哪款是事務2和4(因爲只有產物A購買) 我會忽略交易1和3因爲另一種產品與產品一起購買A

我想查明的是僅有產品A的所有交易。 這意味着,客戶只購買了產品A而沒有購買其他產品。 不知道如何得到這個。

我使用MYSQL的數據庫引擎

+1

爲什麼MySQL標記? – Strawberry

+1

MySQL在名稱周圍不使用'[]',它使用反引號。方括號用於SQL-Server。 – Barmar

+1

你可以發佈樣本數據嗎? –

回答

2
SELECT 
    Transaction_No 
FROM 
    Transactions 
WHERE 
    Date = '01-Jan-2016' 
GROUP BY 
    Transaction_No 
HAVING 
    COUNT(CASE WHEN Product_Id = 'A' THEN Product_Id END) = COUNT(*) 

與條件聚集做一組會給你想要的結果,並且因爲沒有子選擇等,應該瓶坯快於NOT EXISTS的解決方案。

編輯每您的評論:

測試,看看如果一個客戶買了這兩個產品A & B,而你將不得不增加了一些額外的限制你的HAVING子句中沒有其他產品。測試A> 0的COUNT和B> 0的COUNT,然後測試A & B的COUNT與所有產品的COUNT相同。

SELECT 
    Transaction_No 
FROM 
    Transactions 
WHERE 
    Date = '01-Jan-2016' 
GROUP BY 
    Transaction_No 
HAVING 
    COUNT(CASE WHEN Product_Id = 'A' THEN Product_Id END) > 0 
    AND COUNT(CASE WHEN Product_Id = 'B' THEN Product_Id END) > 0 
    AND COUNT(CASE WHEN Product_Id IN ('A','B') THEN Product_Id END) = COUNT(*) 
+0

感謝馬特,查詢執行速度超快。感謝噸。未來,如果我決定將產品B與A一起添加到我的查詢(A + B matchcase),那麼我的查詢應該是沿着COUNT(CASE WHEN Product_Id ='A'或'B'然後Product_ID結束)....? – Sequel3

+0

@Sequel會變得更復雜一點,我認爲你需要擴展你對我的正確回答的渴望,因爲如果你說product_id A或B,這意味着它會給你交易可能是所有的,所有B或A&B是你想要的嗎? – Matt

+0

對不起馬特,我的意思是有product_ids A和B(不單獨A,或只不是B,但是A + B的組合) – Sequel3

0

添加到您的WHERE條款:L

AND [Transaction_No] NOT IN (
    SELECT [Transaction_No] 
    FROM [MystoreDB$Transaction lines] 
    where [Product ID] <> 'A' 
) 

排除誰買了一些其他產品的客戶。

+0

對不起,我將此添加到了我的where子句,並且查詢仍然返回了帶有A和C的產品的客戶ID – Sequel3

+0

他們是否在同一天有A和C的產品01-Jan-2016?如果限制不包含日期,則從子查詢中刪除該限制。 – Barmar

+0

我誤解了這個問題,我以爲你想排除購買其他產品的客戶*,而不是擁有其他產品的交易。我編輯了答案。 – Barmar