【问题标题】:Need to Join 3 Tables with a complex conditon需要加入 3 个条件复杂的表
【发布时间】:2016-10-13 20:38:37
【问题描述】:

我有 3 个数据扩展(数据表)

Subscription

CustomerInfo

Survey

所有三个表都有 CustomerId 作为字段。

以下是我的标准:

  1. 在下标的 Benfitids 中检查 B13 或 B26
  2. CustomerInfo 中的 EmailOptin 为 True
  3. 订阅中的 CreateDt 应超过 30 天并且
  4. 他们在调查表中具有以下条件:

QuestionId= 'purchaseIntentQuestion' 和 AnswerId = '3' 或
QuestionId='goldenQuestion' AND (AnswerId = '1' OR AnswerId = '2')

确保您没有重复的 Customerid 记录

我编写了以下查询,但它没有按预期返回结果。请指教

SELECT distinct sub.CustomerId, Cus.EmailOptin, srv.QuestionID,srv.AnswerId
FROM [Subscription] sub
JOIN [Survey Questions] srv ON sub.CustomerId = srv.CustomerId
JOIN [CustomerInfo] cus ON sub.CustomerId = cus.CustomerId
WHERE 1 = 1
AND CAST(sub.CreateDt AS DATE) < CAST(GETDATE() -30 AS DATE)
AND Cus.EmailOptin  = 'True'
AND 
(
sub.BenefitIds LIKE '%B13%'
OR
sub.BenefitIds LIKE '%B26%'
)
AND 
(
(srv.QuestionId = 'purchaseIntentQuestion' AND srv.AnswerId = '3')
OR 
(srv.QuestionId = 'goldenQuestion' AND (srv.AnswerId = '1' OR srv.AnswerId = '2' ))
)

对于上述查询,即使 EmailOptin 也不是 True。 请指教。

【问题讨论】:

  • 什么是 1 = 1 ?
  • @JimMacaulay - 只是为了区分查询中存在的所有条件。没有其他用途。
  • 那去掉会更好。你能发布你得到的错误/

标签: sql sql-server join


【解决方案1】:

您说“它没有按预期返回结果”所以我真的不知道需要修复什么。我觉得CAST(GETDATE() -30 AS DATE) 是问题所在。为了便于阅读,我还将OR 替换为IN()。试试这个:

SELECT distinct sub.CustomerId,
                Cus.EmailOptin,
                srv.QuestionID,
                srv.AnswerId
  FROM [ Subscription ] sub
  JOIN [ Survey Questions ] srv
    ON sub.CustomerId = srv.CustomerId
  JOIN [ CustomerInfo ] cus
    ON sub.CustomerId = cus.CustomerId
 WHERE 1 = 1
   AND CAST(sub.CreateDt AS DATE) < DATE_ADD(NOW(), INTERVAL 30 DAY) 
   AND Cus.EmailOptin = 'True'
   AND (sub.BenefitIds = '%B13%' OR sub.BenefitIds LIKE '%B26%')
   AND ((srv.QuestionId = 'purchaseIntentQuestion' AND srv.AnswerId = '3') OR
       (srv.QuestionId = 'goldenQuestion' AND
       srv.AnswerId IN('1','2')))

【讨论】:

  • 我正在尝试。同时,如果我想显示订阅者表的所有字段但客户 ID 仍然是唯一的,你能告诉我怎么办吗?会不会像 SELECT distinct sub.*, Cus.EmailOptin, srv.QuestionID,srv.AnswerId FROM [Subscription] sub
  • 但是如果每个 customerid 有超过 1 条记录,那么应该显示所有其他列的哪个值? @PankajGupta
  • 只是表示对于eacu customerid,组合记录应该是唯一的。
  • 哦,是的,然后DISTINCT 在选择的开头将确保整个列集是唯一的。您的另一个选择是使用 GROUP BY col1,col2...colN 。 @PankajGupta
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多