【问题标题】:Counting non-empty values in each column of a table计算表的每一列中的非空值
【发布时间】:2011-11-05 06:45:40
【问题描述】:

我正在寻找数据迁移项目中丢失的数据,这份报告对我有很大帮助。

给定一个 MySQL 表,我想计算该表每一行中的所有空值(NULL 或 '')。输出将是列名列表以及每列的空行或非空行数。我会手动将这些数据与源表进行比较 - 手动进行比较,因为我预计很少有计数可以完全匹配,而且源表和导入表之间的列名完全不同。

我有大约 30 个表格要检查,其中一些有 100 列。我可以从我的 PC 直接访问 MySQL,但无法使用数据库在服务器上运行任何脚本。

TableA 示例

Col1 Col2 Col3
'XX' NULL 'XX'
'XX' NULL ''
'XX' 'XX' 'XX'
'XX' ''   'XX'

我想要的报告是(对于非空计数,'' 算为空):

Col1: 4
Col2: 1
Col3: 3

【问题讨论】:

  • 我最后用 PHP 脚本解决了这个问题。我对每个表进行循环,然后对表中的每一列进行循环,然后对列为 NOT NULL 和非空字符串或数字的表执行 COUNT(*)。结果被放入一个 HTML 表格中,该表格可以很好地复制到电子表格中。它涉及大量查询,但有效。
  • 以防万一解决方案对其他人有用,我已将其发布在这里:academe.co.uk/2011/08/mysql-finding-counts-of-data-by-columns(我将上传原始文件并在我工作后立即修复语法突出显示怎么样)。

标签: mysql data-migration counting


【解决方案1】:

COUNT 也计算空字符串,因此您的查询应如下所示:

SELECT COUNT( NULLIF( col1, '' ) ), COUNT( NULLIF( col2, '' ) ), ...

【讨论】:

  • 谢谢。最后,我将计数拆分为一系列查询,以使其更容易自动化(每一行都是可以显示在表格单元格中的列计数)。
【解决方案2】:

您可以对每个表使用以下查询

SELECT COUNT(*), COUNT(col1) as col1, COUNT(col2) as col2
FROM TABLE1

要获取特定表的所有列,您应该运行查询

 select column_name from information_schema.columns where TABLE_NAME='TABLE1';

此查询的结果可用于自动生成查询,如第一个查询。

【讨论】:

  • 对于 100 列和更多表可能会写很多东西。 ;) @Jason:但如果您熟悉脚本语言,您可以使用Heidi SQL...等工具生成并提交它...
  • 这给了我非空计数,这是一个好的开始。 MySQL 将空字符串视为 NOT NULL(与 Oracle 不同)。目标系统似乎到处随意使用 NULL 和 '' 来表示“这里没有数据”,所以我不能依靠寻找非 NULL 来查找迁移的数据。不过,这是一个好的开始,我可以在文本编辑器中进行一些搜索和替换。
  • 我也许可以在数据库服务器的防火墙上打一个洞,这样我就可以在我的 Web 服务器上编写一些 PHP5 脚本。看来我无法避免编写脚本。
【解决方案3】:

只计算有值的行(跳过空行/空行)!!!

SELECT COUNT( NULLIF( Column_Name, '' ) ) from Table_name

【讨论】:

    【解决方案4】:

    这对我有用

    SELECT count( NULLIF( doctor_id, '' )) as doctor_count,count( NULLIF( chemist_id, '' )) as chemistcount from table_name WHERE employee_id="20";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      相关资源
      最近更新 更多