【问题标题】:T-SQL How To Count Of Records For Each ColumnT-SQL如何计算每列的记录数
【发布时间】:2011-08-15 16:16:35
【问题描述】:

我有一个包含 120 多列的表,需要确定使用最少的列。我尝试使用 sql 查询来执行此操作,但发现 T-SQL 更简单一些。

我尝试了以下方法,但每列的计数都为 0。

Declare  data1 Cursor for select column_name 
        from information_schema.columns 
        where table_name = 'repository' 

Declare @mField nvarchar(255)
Declare @count int

Open data1;

fetch next from  data1 into @mField;

set @count = -1;

while @@fetch_status = 0  
    begin
         select   @count = count(@mField)
                    from  repository where tablereference = 
                    'central' and ( @mField!= null )

        print @mField+' ' ; 
                  print @count;
        Fetch next from  data1 into @mField;
    end

close data1;
deallocate data1;

【问题讨论】:

  • 定义“最少使用”。此外,您的查询逻辑被破坏,您无法将任何内容与 NULL (@mField != null) 进行比较。做到这一点(@mField 不为空)

标签: tsql cursor


【解决方案1】:

您不能计算这样的值,因为您只是在测试 @mField 是否为 NULL。列名未被替换。

COUNT 无论如何都会忽略 NULL,因此如果您想计算非空值,请执行以下操作:

DECLARE @sql varchar(4000)

SET @sql = 'SELECT COUNT(*) AS Total '

SELECT @sql = @sql + ', COUNT(' +  QUOTENAME(column_name) + ') AS ' + QUOTENAME(column_name)
from information_schema.columns 
where table_name = 'repository'

SET @sql = @sql + ' FROM repository'

EXEC (@sql)

这会为所有列查询一次表

【讨论】:

  • 不错的策略。您需要在以下行中删除 repository 周围的引号:where table_name = ''repository''SET @sql = @sql + 'FROM 'repository''。 (你是mysql模式吗?)
  • 这不会导致单行包含大量元组吗?
  • @AnthonyHancock no.
  • 刚刚运行了代码。它绝对返回单行,每列的计数为一列。
  • 那么,随便。这是7年前。如果你愿意,写一个更好的答案。
【解决方案2】:

你需要在中间使用一些动态sql来实现你的目标。

    Declare  data1 Cursor for select column_name 
            from information_schema.columns 
            where table_name = 'repository' 

    Declare @mField nvarchar(255)


    Open data1;

    fetch next from  data1 into @mField;


    while @@fetch_status = 0  
    begin
        exec ('

            declare @count int

            select @count = count([' + @mField + '])
                        from  repository  where tablereference = 
                    ''central'' and ( [' + @mField + '] is not null)                                    

            if @count < 10
            begin
                print ''' + @mField + ' '' ; 
                print @count;
            end         
        ')
        Fetch next from  data1 into @mField;
    end

close data1;
deallocate data1;

【讨论】:

    【解决方案3】:

    您的count(@mField) 是碰巧在@mField 中的文字值的计数,它将字段名称解析为COUNT(fldBlah),您需要为此使用动态SQL .

    Declare data1 Cursor FAST_FORWARD for select column_name 
            from information_schema.columns where table_name = 'repository' 
    
    Declare @mField nvarchar(255)
    Declare @SQL varchar(1024)
    Declare @results table (col_name varchar(128), non_nulls int)
    
    Open data1;
    fetch next from data1 into @mField;
    
    while (@@FETCH_STATUS = 0) begin
        set @SQL = 'SELECT ''' + @mField + ''', count(' + @mField + ') from repository where tablereference =  ''central'''
        insert @results
                   exec(@SQL)
        Fetch next from data1 into @mField;
    end
    
    close data1;
    deallocate data1;
    
    select * from @results
    

    对于类似的输出;

    col_name            non_nulls
    [tablereference]    5
    [another_col]       1
    

    tablereference 等列中有 5 个非空值

    【讨论】:

      【解决方案4】:

      您需要使用IS NOT NULL 而不是!= NULL

      【讨论】:

      • 测试只针对@mField 值。 SQL 不支持这样的动态列
      猜你喜欢
      • 2015-01-31
      • 2011-02-16
      • 1970-01-01
      • 2020-08-27
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多