SQL(SQLite)计算所有列的空字段

时间:2011-12-02 17:31:49

标签: sql sqlite count

我有一个名为datapoints的表,大约有150列和2600行。我知道,150列太多了,但是在导入csv之后我得到了这个数据库,并且不可能缩小列数。

我必须从数据中获取一些统计信息。例如。一个问题是: 给我(所有列的)字段总数,它们是null。有人知道我怎么能有效地做到这一点吗?

对于一列,这不是问题:

SELECT count(*) FROM datapoints tb1 where 'tb1'.'column1' is null;

但是,我怎样才能为所有列解决这个问题,而不是每列都手动完成?

最佳, 迈克尔

4 个答案:

答案 0 :(得分:1)

以Lamak的想法为基础,这个想法如何:

SELECT (N * COUNT(*)) - (
    COUNT(COLUMN_1) 
  + COUNT(COLUMN_2) 
  + ... 
  + COUNT(COLUMN_N)
)
FROM DATAPOINTS;

其中N是列数。诀窍在于制作COUNT(列)的总和系列,但是对于好的文本编辑器和/或电子表格来说这不应该太糟糕。

答案 1 :(得分:0)

好吧,COUNT(以及大多数聚合功能)忽略NULL个值。在您的情况下,由于您使用COUNT(*),它会计算表中的每一行,但您可以在任何列上执行此操作。像这样:

SELECT TotalRows-Column1NotNullCount, etc
FROM (
    SELECT COUNT(1) TotalRows,
           COUNT(column1) Column1NotNullCount,
           COUNT(column2) Column2NotNullCount,
           COUNT(column3) Column3NotNullCount ....
    FROM datapoints) A

答案 2 :(得分:0)

我认为没有一种简单的方法可以做到这一点。我将开始150个查询。你每次只需要替换一个单词(列名)。

答案 3 :(得分:0)

开始使用视觉查询工具生成字段列表然后在电子表格程序中使用剪切/粘贴/搜索/替换或操作将其转换为所需内容通常很有帮助。要一步完成所有操作,您可以使用以下内容:

SELECT SUM(CASE COLUMN1 WHEN NULL THEN 1 ELSE 0 END) +
       SUM(CASE COLUMN2 WHEN NULL THEN 1 ELSE 0 END) +
       SUM(CASE COLUMN3 WHEN NULL THEN 1 ELSE 0 END) +
       ...
FROM DATAPOINTS;

使用可视化查询构建器,您可以快速生成:

SELECT COLUMN1, COLUMN2, COLUMN3  ... FROM DATAPOINTS;

然后,您可以将逗号替换为需要在两个字段名称之间显示的所有文本,然后修复第一个和最后一个字段。所以在示例中搜索“,”并替换为“WHEN NULL 1 ELSE 0 END”+ SUM(CASE“然后修复第一个和最后一个字段。