请帮忙 - 我对这不应该是一个困难的查询感到困惑。 我正在使用sql server 2012,并希望用电子邮件地址列出我的客户。
我有一个Customer表,其中包含一个默认电子邮件地址,以及一个包含该人员电子邮件地址的联系人表。每个客户可能有多个联系人,或者他们可能没有联系人。联系人可以用于多种目的,并且在ContactDocumentOption表中为每个目的都有一个条目。我只对有目的类型= 102
的联系人感兴趣对于每个客户,我想显示102型联系人的电子邮件地址(如果多于一个,或者任何一个将会执行,则为第一个)。如果没有102型联系人,那么我想显示客户的默认电子邮件地址。
以下查询未获取联系人电子邮件,除非它恰好是该客户的第一个联系人,如果客户有两个联系人且第一个不是类型102,则联系人电子邮件为空
SELECT C.Code as Customer
, C.Name as CustomerName
, C.Email
, CC.Email
, ISNULL(CC.Email, C.Email) as Email
FROM [dr].[Customer] C
LEFT OUTER JOIN
(
Select TOP 1 CDO.ContactId
, CustomerId
, Email
from dr.Contact CC
INNER JOIN dr.ContactDocumentOption CDO on CDO.ContactId = CC.ContactId
where CDO.TransactionTypeId = 102
Order by Email
) CC on CC.CustomerId = C.CustomerId
认为这是因为在确定它是102之前,TOP 1只获得了顶级联系人我将查询更改为以下内容,但结果相同。
SELECT C.Code as Customer
, C.Name as CustomerName
, C.Email
, CC.Email
, ISNULL(CC.Email, C.Email) as Email
FROM [dr].[Customer] C
LEFT OUTER JOIN
(
SELECT CustomerId
, CT.ContactId
, Email
from dr.Contact CT
INNER JOIN
(
Select TOP 1 ContactId from dr.ContactDocumentOption
where TransactionTypeId = 102
) CDO on CDO.ContactId = CT.ContactId
) CC on CC.CustomerId = C.CustomerId
我确实从之前的帖子中得到了一些帮助,但没有任何效果,所以我正在寻求进一步的帮助。谢谢。
答案 0 :(得分:0)
如果不了解有关表格或数据的更多信息,很难回答这个问题,但这样的事情会让你开始吗?
在cte中:
使用COUNT()OVER()来确定联系人是否具有102 TransTypeID
如果没有TransType 102,则允许您仅抓取1封电子邮件的行数
然后联合具有TransType 102且记录不包含的记录。
;WITH cte as (
Select CDO.ContactId,
CustomerId,
Email,
CDO.TransactionTypeId,
COUNT(CASE WHEN TransactionTypeId = 102 THEN 1 ELSE 0 END) OVER (PARTITION BY Customerid) AS cnt,
ROW_NUMBER() OVER(PARTITION BY CustomerId ORDER BY TransactionTypeId ASC) as rn
from dr.Contact CC
INNER JOIN dr.ContactDocumentOption CDO
ON CDO.ContactId = CC.ContactId
)
SELECT CDO.ContactId,
CustomerId,
Email,
CDO.TransactionTypeId
FROM cte c
WHERE TransactionTypeId = 102
UNION
SELECT CDO.ContactId,
CustomerId,
Email,
CDO.TransactionTypeId
FROM cte c
WHERE cnt = 0 and rn = 1