SQL server–获取仅在线购买的客户的行

SQL server–获取仅在线购买的客户的行,sql,sql-server,Sql,Sql Server,我有一个表TransactionData,其中包含客户的交易数据,还有一个表订阅者,其中包含时事通讯订阅者。这就是我需要做的 从TransactionData表中选择也在subscribers表中且仅购买了产品online StoreID=50001的所有订户 这两个表的唯一键是客户电子邮件地址 这是基本的表结构 TransactionData Email StoreID OrderID customer1@mail.com 50001 101 customer

我有一个表TransactionData,其中包含客户的交易数据,还有一个表订阅者,其中包含时事通讯订阅者。这就是我需要做的

从TransactionData表中选择也在subscribers表中且仅购买了产品online 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
我不知道如何排除在网上和店内购买的客户。您能帮我做一下吗?

您可以使用除此之外的方法,该方法返回仅在线购买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
试试这个:

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
你可以分组


我就是这么做的

将有效数据保存在临时表中,临时表已从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
对,这应该是结果

然后,使用此临时表从自身进行验证。我创建了两种类型的专栏,一种是你在网上商店中购买这封电子邮件的专栏,另一种是你在网上商店中购买这封电子邮件的专栏

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
这应该是结果

现在,剩下的是过滤所有只在你的在线商店购买的不同的电子邮件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)

您如何确定是否在线购买?您正在从订阅者表中选择StoreID,但在“基本表结构”中没有StoreID?@jarlh..当然..为了更快的查询响应。exceptand intersect没有任何all修饰符,只有union有。哇,这是我有史以来的第一篇帖子,我将尝试您的所有建议!谢谢!!:@SatenderK查询不会产生所需的结果,因此否决票是合理的。如果你想摆脱我的反对票,而不是玛丽纳斯的反对票,请更正或删除答案。谢谢!你能告诉我怎么做吗?如果我想从TransactionData中排除所有在线购买50001的用户?
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
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)