通过查询,我想检查数据库中的所有贷款,无论它们的主要信贷接受者是否填写了电子邮件地址。
我遇到的问题是地址表存储了各种类型的地址(还有物理/传真地址等)。我不能只过滤电子邮件地址,因为我仍然希望查看所有贷款(也包括没有电子邮件的贷款),以查看是否有电子邮件。
我当前的查询仍然显示具有邮件和另一种地址形式的贷款的多行。
select l.ApplicationNumber, p1.Name AS Credittaker, a1.EAddress AS 'Mail
credit taker',
SUM(case
when c1.ContactChannelTypeID = 2 AND a1.ElectronicAddressTypeID = 1 then 1
else 0 end) as MailID
from Line l
JOIN Role r1 on (l.ObjID = r1.ObjID_Businessobject)
JOIN Party p1 on (p1.ObjID = r1.ObjID_Party)
JOIN ContactChannel c1 on (p1.ObjID = c1.ObjID_Party)
JOIN Address a1 on (a1.ObjID = c1.ObjID_Address)
WHERE r1.RDNameID = '17' AND r1.Enddate IS NULL AND c1.EndDate IS NULL
GROUP BY l.ApplicationNumber, p1.Name, a1.EAddress
order by l.ApplicationNumber
我想要的是查询是否在每个电子邮件中显示1行(如果有一封电子邮件,即MailID为1的行),以仅显示该应用程序号的值。如果未找到电子邮件(即仅具有MailID 0的行),则显示此值。
我该怎么做?
结果示例与预期结果:
11650和11651仅具有非电子邮件地址,因此MailID = 0的值正确。 11652和11653都有一个电子邮件地址和其他类型的地址,因此应该只显示MailID =1。将MAX(MailID)
添加到Group by
子句中是行不通的,因为它无法识别列名。如果将case语句放在子查询中,然后再引用它,则会收到一个错误,即一个聚合函数不能包含另一个聚合函数。
答案 0 :(得分:0)
我认为这会起作用:
select top (1) with ties . . .
. . .
order by row_number() over (partition by l.ApplicationNumber order by MailId desc);
我不确定100%可以在order by
中使用像这样的列别名。如果没有,那么:
with t as (
<your query here with no order by>
)
select
from (select t.*,
row_number() over (partition by applicationNumber order by mailid desc) as seqnum
from t
) t
where seqnum = 1;