以下是一个例子:我想看看我的营销工作对于我试图在商店销售的产品有多好。例如,我想知道有多少人在他们在2014年12月1日的电子邮件中收到我的产品后一个月内购买了我的产品,相比之下,有多少人在同一时间内购买了我的产品而没有收到优惠券。 以下是我的Customer表的示例:
CUSTOMER_NUMBER PURCHASE_DATE
--------------- -------------
1 2014-12-02
2 2014-12-05
3 2014-12-05
4 2014-12-10
5 2014-12-21
以下是我的电子邮件表格的示例
CUSTOMER_NUMBER EMAIL_ADDR SEND_DATE
--------------- ------------ ----------
1 john@abc.com 2014-12-01
3 mary@xyz.com 2014-12-01
5 beth@def.com 2014-12-01
我非常清楚如何确定谁用优惠券购买产品:我在两张桌子上使用内部连接。但是为了确定谁买了这个产品,即使他们因为某种原因没有优惠券(他们没有电子邮件,他们是控制组的一部分等),我认为< / em>我需要使用左连接来获取结果集,然后从我的第一个结果集中减去内连接的结果。唉,这就是我被困住的地方。在上面的示例中,客户2和5购买了产品,即使他们从未收到优惠券,但我无法弄清楚如何编写查询来返回该数据。 我正在使用IBM的Netezza DB。谢谢!!
答案 0 :(得分:5)
将Left Outer Join
与NULL
检查
SELECT C.*
FROM customer C
LEFT OUTER JOIN email e
ON C.customer_Number = E.Custmer_Number
WHERE E.customer_Number IS NULL
或使用Not Exists
SELECT *
FROM customer C
WHERE NOT EXISTS (SELECT 1
FROM email e
WHERE c.customer_number = e.customer_number)
答案 1 :(得分:0)
select from customers c left outer join email e
on c.customer_number = e.customer_number
where e.customer_number is null
or C.purchase_date < e.send_date
答案 2 :(得分:0)
SELECT
C.*,
PurchasedWithin30DaysOfEmailedCoupon =
CASE WHEN EXISTS (
SELECT *
FROM
Email E
WHERE
C.CustomerID = E.CustomerID
AND C.Purchase_Date <= E.Send_Date
AND E.Send_Date < DateAdd(day, 30, C.Purchase_Date)
) THEN 1 ELSE 0 END
FROM
Customer C
WHERE
C.PurchaseDate IS NOT NULL
;
请原谅我不知道在DBMS中添加30天的正确语法 - 我确信这对您来说是一个简单的修复。
然后,您只需按PurchasedWithin30DaysOfEmailedCoupon
值进行分组即可计算。