我有一个包含客户交易数据的表(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
我无法弄清楚如何排除在线和商店购买的客户。你能帮我解决这个问题吗?
答案 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
对,这应该是结果
然后,使用此临时表来自行验证。我创建了两种类型的列,一列用于标识此电子邮件在您的在线商店中购买,另一列用于标识此电子邮件不是从您的在线商店购买的。
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)
答案 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