TSQL计算空值 - 当所有分组项都具有空字段

3

我试图理解所需的逻辑/命令:

我有一个联系人表,每个联系人都有一个客户与之对应(多对一关系)。 我正在尝试获取所有联系人的电子邮件字段都为NULL的客户ID。

示例数据:

ContactID   EmailAddress    ClientID
1           NULL                3
907         NULL                3
2468        NULL                3
2469        email@email.com     4
1077        NULL                4
908         email@email.com     4
2           email@email.com     4
3           email@email.com     5
909         email@email.com     5

谢谢!


1
那么对于上面的例子,答案是3对吗? - TechDo
相关问题 - https://dev59.com/wnA75IYBdhLWcg3wAEDx - Erran Morad
3个回答

7
您可以使用分组聚合和一个 HAVING 子句来实现此操作(假设空电子邮件地址可以视为 null):
SELECT 
    ClientID
    FROM ClientEmails
    GROUP BY ClientID
    HAVING MAX(LEN(ISNULL(EmailAddress, ''))) = 0;

SqlFiddle


很好。这个数据库是不依赖特定数据库的吗?另外,你能告诉我我的查询是否正确吗?谢谢。陈旗。 - Erran Morad
2
HAVING是ANSI标准。ISNULLLEN不是 - COALESCEISNULL更具可移植性(还有其他替代方案,例如Oracle有NVL)。大多数数据库都有与LEN等效的函数,例如LENGTH。您的查询很好 - 排除NULL的COUNT(x)似乎是标准行为 - StuartLC

7
这会有帮助吗?
select *
from
(
select clientId, 
COUNT(emailAddress) as Mailz, 
COUNT(contactId) as Contacts
from contacts
group by clientId
) as src
where (Mailz = 0 and contacts > 0)

你能详细说明一下吗? - potashin

2

请尝试以下方法:

SELECT 
    ClientID
FROM(
    SELECT 
        ClientID, 
        SUM(CASE WHEN EmailAddress IS NULL THEN 1 ELSE 0 END) a,
        COUNT(*) b
    FROM YourTable
    GROUP BY ClientID
)x WHERE a=b

1
可以在HAVING子句中过滤而不需要子查询,例如HAVING COUNT(*) = SUM(CASE WHEN EmailAddress IS NULL THEN 1 ELSE 0 END) - John Woo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接