3

考虑下表:

id | name | phone | email
------------------------_-----
1  |  bob | null  | me@me.com
2  |  bob | null  | null
3  |  bob | 12345 | null
4  |  bob | 23456 | null

我想要一个查询,可以汇总电话和电子邮件中有多少字段不为空的计数。所以结果将是:

phone | email
-------------
   2  |  1 

我需要为超过一百万行的表的 175 列中的每一列找出这样的值。

查询不需要很漂亮,也不需要特别快。但我更喜欢它是否可以在一个(可能是嵌套的)查询中,而不是脚本中。

4

2 回答 2

7

关于什么

SELECT count(*) as record_count,
       count(phone) as phone_not_null,
       count(email) as email_not_null
  FROM yourtable

count(columnname)计算值不为空count(*)的次数,并计算记录数。

于 2013-09-10T18:14:31.690 回答
1

对于百分比,计算非空值和总值,然后进行数学运算:

SELECT
  COUNT(phone) / COUNT(*) * 100 AS PctNonNullPhone,
  COUNT(email) / COUNT(*) * 100 AS PctNonNullEmail
FROM MyTable

COUNT(phone)phone如果不为空,则只会计算一行。COUNT(*)计算每一行,没有条件。


附录:David Aldridge 指出空表将是一个问题。他是对的:它会导致除以零错误。该NULLIF函数可以方便地解决这个问题:

SELECT
  COUNT(phone) / NULLIF(COUNT(*), 0) * 100 AS PctNonNullPhone,
  COUNT(email) / NULLIF(COUNT(*), 0) * 100 AS PctNonNullEmail
FROM MyTable

在此版本中,如果表为空(即COUNT(*)为零),则两列将为空。

于 2013-09-10T18:19:05.300 回答