在SQL Server Management Studio中按组仅显示case语句的最大值

时间:2018-12-28 12:51:20

标签: sql sql-server

通过查询,我想检查数据库中的所有贷款,无论它们的主要信贷接受者是否填写了电子邮件地址。

我遇到的问题是地址表存储了各种类型的地址(还有物理/传真地址等)。我不能只过滤电子邮件地址,因为我仍然希望查看所有贷款(也包括没有电子邮件的贷款),以查看是否有电子邮件。

我当前的查询仍然显示具有邮件和另一种地址形式的贷款的多行。

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的行),则显示此值。

我该怎么做?

结果示例与预期结果:

link

11650和11651仅具有非电子邮件地址,因此MailID = 0的值正确。 11652和11653都有一个电子邮件地址和其他类型的地址,因此应该只显示MailID =1。将MAX(MailID)添加到Group by子句中是行不通的,因为它无法识别列名。如果将case语句放在子查询中,然后再引用它,则会收到一个错误,即一个聚合函数不能包含另一个聚合函数。

1 个答案:

答案 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;