【问题标题】:TSQL Counting Nulls - where all grouped items have NULL fieldTSQL Counting Nulls - 所有分组项都有 NULL 字段
【发布时间】:2014-05-14 17:32:08
【问题描述】:

只是想了解所需的逻辑/命令:

我有一个联系人表。每个联系人都有一个多对一的客户。 我正在尝试获取所有联系人的电子邮件都为 NULL 值的任何 clientID。

示例数据:

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

谢谢!

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

请尝试:

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

【讨论】:

  • 可以在没有子查询的情况下完成,只需在HAVING 子句中过滤它,例如。 HAVING COUNT(*) = SUM(CASE WHEN EmailAddress IS NULL THEN 1 ELSE 0 END)
【解决方案2】:

您可以使用分组聚合和HAVING 子句来做到这一点(假设空白电子邮件地址可以被视为空值):

SELECT 
    ClientID
    FROM ClientEmails
    GROUP BY ClientID
    HAVING MAX(LEN(ISNULL(EmailAddress, ''))) = 0;

SqlFiddle

【讨论】:

  • 不错。这个数据库是不可知的吗?另外,你能告诉我我的查询是否也可以。谢谢。陈奎。
  • HAVING 是 ANSI。 ISNULLLEN 不是 - COALESCE 将比 ISNULL 更便携(并且存在其他替代方案,例如 Oracle 具有 NVL)。大多数 DB 具有 LEN 的等价物,例如LENGTH 。您的查询很好 - COUNT(x) 不包括 NULL 似乎是 standard behaviour
【解决方案3】:

这会有帮助吗?

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)

【讨论】:

  • 你能详细说明一下吗?
猜你喜欢
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多