SQL服务器 - 获取仅在线购买的客户的行

时间:2015-09-04 12:42:28

标签: sql sql-server

我有一个包含客户交易数据的表(TransactionData)和一个包含客户通讯订阅者的表(订阅者)。这就是我需要做的。

从TransactionData表中选择同样位于Subscribers表中并且仅在线购买产品的所有订户(StoreID = 50001)。

两个表的唯一键是客户电子邮件地址。

这是基本的表结构。

TransactionData
Email               StoreID OrderID
customer1@mail.com  50001   101
customer1@mail.com  50001   102
customer2@mail.com  50001   201
customer2@mail.com  51111   202
customer3@mail.com  50001   301
customer3@mail.com  50001   302


Subscribers
Email
customer1@mail.com
customer2@mail.com


Desired result
Email               StoreID
customer1@mail.com  50001

这是我目前的查询:

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

我无法弄清楚如何排除在线和商店购买的客户。你能帮我解决这个问题吗?

6 个答案:

答案 0 :(得分: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 

答案 1 :(得分:2)

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

INSERT INTO @TransactionData
    ([Email], [StoreID], [OrderID])
VALUES
    ('customer1@mail.com', 50001, 101),
    ('customer1@mail.com', 50001, 102),
    ('customer2@mail.com', 50001, 201),
    ('customer2@mail.com', 51111, 202),
    ('customer3@mail.com', 50001, 301),
    ('customer3@mail.com', 50001, 302)
;


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

INSERT INTO @Subscribers
    ([Email])
VALUES
    ('customer1@mail.com'),
    ('customer2@mail.com')
;

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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分: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

然后,使用此临时表来自行验证。我创建了两种类型的列,一列用于标识此电子邮件在您的在线商店中购买,另一列用于标识此电子邮件不是从您的在线商店购买的。

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)

答案 5 :(得分:-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