2015-09-04 28 views
3

我有一個包含客戶交易數據的表(TransactionData)和一個包含通訊訂戶的客戶的表(訂戶)。這是我需要做的。SQL服務器 - 獲取僅在線購買的客戶的行

從TransactionData表中選擇也在Subscribers表中並且僅在線購買產品(StoreID = 50001)的所有訂戶。

這兩個表的唯一鍵是客戶的電子郵件地址。

這是基本的表結構。

TransactionData 
Email    StoreID OrderID 
[email protected] 50001 101 
[email protected] 50001 102 
[email protected] 50001 201 
[email protected] 51111 202 
[email protected] 50001 301 
[email protected] 50001 302 


Subscribers 
Email 
[email protected] 
[email protected] 


Desired result 
Email    StoreID 
[email protected] 50001 

這是迄今爲止我的查詢:

SELECT b.Email, b.StoreID 
FROM TransactionData AS a 
INNER JOIN Subscribers AS b 
ON a.Email = b.Email 
WHERE a.BoutiqueId = 50001 

我無法弄清楚如何排除那些已經購買了在網上和商店的客戶。你能幫助我嗎?

+0

你如何決定購買是否在線? – DarkKnight

+0

您正在從Subscribers表中選擇StoreID,但在「基本表結構」中沒有StoreID? – Doolius

回答

2
SELECT t.Email , t.StoreID 
FROM TransactionData t 
WHERE EXISTS (SELECT 1 
       FROM Subscribers 
       WHERE t.Email = Email) 
AND NOT EXISTS (SELECT 1 
       FROM TransactionData 
       WHERE t.Email = Email 
       AND StoreID <> 50001) 
GROUP BY t.Email , t.StoreID 
+0

謝謝!你能告訴我如何做另一種方式嗎?如果我想從TransactionData中排除在線購買的所有商品(50001)? – Marina

0

您可以使用except返回誰只是做了一個在線購買(botiqueid = 50001)的客戶

SELECT b.Email, b.StoreID 
FROM TransactionData AS a 
INNER JOIN Subscribers AS b 
ON a.Email = b.Email 
WHERE a.BoutiqueId = 50001 
EXCEPT 
SELECT b.Email, b.StoreID 
FROM TransactionData AS a 
INNER JOIN Subscribers AS b 
ON a.Email = b.Email 
WHERE a.BoutiqueId <> 50001 
+0

也許除外? – jarlh

+0

@ jarlh..sure ...提高查詢響應速度。 –

+0

'except'和'intersect'沒有任何'all'修飾符,只有'union'。 – jpw

-1

試試這個:

SELECT 
    a.Email, a.StoreID 
FROM 
    TransactionData AS a 
     INNER JOIN 
    Subscribers AS b ON a.Email = b.Email 
WHERE 
    a.StoreID = 50001 
GROUP BY a.Email 
+0

哇這是我的第一篇文章,我會嘗試所有的建議!謝謝!! :) – Marina

+0

@Marina請upvote吧!!! –

+0

@SatenderK查詢不會產生所需的結果,因此投票結果是正確的。要麼糾正它或刪除答案,如果你想擺脫反對票(這是我的,而不是馬林納斯)。 – jpw

2
declare @TransactionData TABLE 
    ([Email] varchar(18), [StoreID] int, [OrderID] int) 
; 

INSERT INTO @TransactionData 
    ([Email], [StoreID], [OrderID]) 
VALUES 
    ('[email protected]', 50001, 101), 
    ('[email protected]', 50001, 102), 
    ('[email protected]', 50001, 201), 
    ('[email protected]', 51111, 202), 
    ('[email protected]', 50001, 301), 
    ('[email protected]', 50001, 302) 
; 


declare @Subscribers TABLE 
    ([Email] varchar(18)) 
; 

INSERT INTO @Subscribers 
    ([Email]) 
VALUES 
    ('[email protected]'), 
    ('[email protected]') 
; 

select T.Email,T.StoreID from @TransactionData T 
INNER JOIN @Subscribers TT 
ON TT.Email = T.Email 
WHERE NOT EXISTS (SELECT 1 
       FROM @TransactionData 
       WHERE t.Email = Email 
       AND StoreID <> 50001) 
GROUP BY T.Email,T.StoreID 
0

你可以使用GROUP BY

SELECT 
EMail, MIN(StoreID) AS StoreID 
FROM TransactionData 
GROUP BY EMail HAVING SUM(CASE WHEN StoreID = 50001 THEN 0 ELSE 1 END) = 0 
0

那麼這就是我所做的。

將您的「有效」數據保存在從TransactionData與Subscribers表內部連接的臨時表中。

SELECT 
    a.Email 
    , a.OrderID 
    , a.StoreID 
INTO #tmpValidCustomers 
FROM TransactionData AS a 
INNER JOIN Subscribers AS b 
ON 
    a.Email = b.Email 

正確的,這應該是結果

enter image description here

然後,使用臨時表從自身來驗證。我創建了2種類型的列,一列用於標識您的在線商店中購買的此電子郵件,另一列是您標識的此電子郵件不是從您的在線商店購買的。

SELECT 
     Email 
     , OrderID 
     , StoreID 
     , (SELECT TOP 1 OrderID FROM #tmpValidCustomers WHERE Email = v.Email and StoreID = 50001) AS [Cond1] 
     , (SELECT TOP 1 OrderID FROM #tmpValidCustomers WHERE Email = v.Email and StoreID <> 50001) AS [Cond2] 
    FROM #tmpValidCustomers v 

,這應該是這個結果

enter image description here

現在,什麼左邊是過濾所有不同的電子郵件ID的其中僅誰在你的網上商店購買。執行上表中的外部選擇。

SELECT 
    DISTINCT 
     Email 
     , StoreID 
FROM (
    SELECT 
     Email 
     , OrderID 
     , StoreID 
     , (SELECT TOP 1 OrderID FROM #tmpValidCustomers WHERE Email = v.Email and StoreID = 50001) AS [Cond1] 
     , (SELECT TOP 1 OrderID FROM #tmpValidCustomers WHERE Email = v.Email and StoreID <> 50001) AS [Cond2] 
    FROM #tmpValidCustomers v 
) AS T 
WHERE 
    T.Cond1 IS NOT NULL AND T.Cond2 IS NULL 

編輯:我的歉意,它可以通過這種方式單獨完成。

SELECT DISTINCT 
    a.Email 
    , a.StoreID 
FROM TransactionData AS a 
INNER JOIN Subscribers AS b 
ON 
    a.Email = b.Email 
WHERE 
    a.Email NOT IN (SELECT Email FROM #TransactionData WHERE StoreID <> 50001) 
相關問題