MySQL - 如何计算空值和非空值?

30

我有一个简单的 安装 表:

  • prod_code
  • email
  • install_slot

如果 install_slot 为 NULL,则它是可用的安装槽。如果不为 null,则为已使用的槽。 我需要返回给定产品和电子邮件的总安装数的结果,以及给定产品和电子邮件的已使用安装的结果。我想我可以通过两个查询来完成这个任务,但想知道是否有一种 SQL 的方法可以在一个查询中完成所有操作?

我尝试了以下的猜测,但是它没有起作用

SELECT
    i1.`prod_code`,
    COUNT(i1.`email`) AS total_installs,
    COUNT(ISNULL(i2.`install_slot`)) AS used_installs
FROM
    `installs` AS i1
JOIN
    `installs` AS i2
ON
    i1.`prod_code` = i2.`prod_code`
WHERE
    i1.`email` = 'example@example.com'
GROUP BY
    i1.`prod_code`,i2.`prod_code`

1
我不明白你的意思,Lightness。你不理解句子中带问号的部分吗?从“我猜”开始的那一部分,你不理解吗? - Volomike
我没有谈论那个句子,对吧。 - Lightness Races in Orbit
啥?我还是不明白你的意思。 - Volomike
2
我仍然认为你的评论没有太多建设性。我的反驳也得到了赞同,在你抱怨我的问题风格不清晰的1分钟内,以及我实际发布问题的2分钟内,有人很容易地理解了问题并解决了它。我的意思是,至少我展示了我尝试过什么,而且我的测试案例并不需要太多的脑力来理解。我是说,拜托,你是一名C++程序员——你见过更难的问题。 - Volomike
我从未说过这个问题很难。我试图训练你摆脱说“它不起作用”而不是描述程序行为并将其与所需的行为进行比较的不良习惯。一个编程问题永远不应该包含“它不起作用”的字眼。但我已经放弃了。 - Lightness Races in Orbit
2个回答

57
SELECT prod_code,
       COUNT(email) AS total_installs,
       COUNT(install_slot) AS used_installs
FROM installs
WHERE email='example@example.com'
GROUP BY prod_code

COUNT 仅计算 NOT NULL 值。


哇,我很惊讶它居然成功了。在我脑海中,似乎它不会起作用,但它确实起作用了。 - Volomike
@Lightness Races in Orbit:说“它工作了”也是一个坏习惯吗? - Monica Heddneck

10
提供的解决方案对我没有起作用。我需要进行以下修改:
SELECT prod_code,
       COUNT(NULLIF(email,'')) AS total_installs,
       COUNT(NULLIF(install_slot,'')) AS used_installs
FROM installs
WHERE email='example@example.com'
GROUP BY prod_code

3
可能是因为电子邮件地址不是空值,而是空字符串。通过使用 nullif 函数,您将空字符串转换为了空值(null)。这样,count() 函数就无法对其进行计数。 - hbogert

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