【问题标题】:MySQL - How Do I Count Nulls and Not Nulls?MySQL - 我如何计算空值而不是空值?
【发布时间】:2012-03-03 22:35:02
【问题描述】:

我有一个简单的安装量表

  • prod_code
  • 电子邮件
  • 安装槽

如果 install_slot 为 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`

【问题讨论】:

  • 我不懂你,Lightness。以“我猜”开头的带问号的句子的哪一部分你不明白?
  • 没有。我不是在说那句话,是吗?
  • 嗯?我还是不关注你。
  • 我仍然没有发现你的 cmets 很有建设性。我的反对意见也被赞成,在你抱怨我的问题风格不清楚的 1 分钟内,我实际发布问题的 2 分钟内,有人轻松抓住了问题并解决了问题。我的意思是,至少我展示了我尝试过的东西,而且我的测试用例并没有涉及很多脑力来理解。我的意思是,拜托,你是一个 C++ 程序员——你见过更难的问题。
  • 我没有说这个问题很难;甚至没有一次。我试图训练您摆脱说“它不起作用”而不是描述程序行为并将其与您想要的行为进行比较的不良习惯。一个编程问题应该永远包含“它不起作用”的字眼。但我已经放弃了。

标签: mysql sql group-by isnull notnull


【解决方案1】:
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 值。

【讨论】:

  • 哇。我很惊讶这实际上奏效了。在我看来,这似乎行不通,但确实可行。
  • @Lightness Races in Orbit:说“它有效”也是一个坏习惯吗?
【解决方案2】:

提供的解决方案对我不起作用。我不得不修改如下:

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

【讨论】:

  • 可能是因为电子邮件不是空的,而是空字符串。通过执行nullif ,您将空字符串转换为空值。因此count() 不算数
猜你喜欢
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
  • 2015-10-13
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多