SQL server–获取仅在线购买的客户的行
我有一个表TransactionData,其中包含客户的交易数据,还有一个表订阅者,其中包含时事通讯订阅者。这就是我需要做的 从TransactionData表中选择也在subscribers表中且仅购买了产品online StoreID=50001的所有订户 这两个表的唯一键是客户电子邮件地址 这是基本的表结构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
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)