表名称中所有列的SQL COUNTcolumn_name

问题描述

我大约有1000列。通过排除每个字段的空值,我们能否获得表中每一列的数字记录。 表名称查询中的sql COUNT(column_name)排除空值。但是不可能对1000列进行手动操作。请让我知道是否还有其他程序可以完成。

解决方法

以下是动态SQL的示例:

/* Param var of the table to be queried */
DECLARE @Table VARCHAR(50) = 'Misc';

/* Build a list of column names to count */

DECLARE @sql VARCHAR(MAX) = ''; -- Important to initialize to an empty string.

SELECT @sql = @sql 
    + CASE WHEN LEN( @sql ) > 0 THEN ',' ELSE '' END
    + CASE TYPE_NAME( system_type_id )
        WHEN 'text' THEN 'COUNT( CAST([' + [name] + '] AS varchar(1) ) ) AS [' + [name] + '_count]'
        ELSE 'COUNT( [' + [name] + '] ) AS [' + [name] + '_count]'
    END
FROM [sys].[columns] WHERE 
    [object_id] = OBJECT_ID ( @Table );

/* Complete and execute dynamic statement */

SET @sql = 'SELECT ' + @sql + ' FROM ' + @Table + ';';
EXEC( @sql );

Teradata转换: https://www.jooq.org/translate/

declare Table varchar(50) default 'tblOrders';
declare sql varchar(32000) default '';
select ((@sql + case
  when length(@sql) > 0 then ','
  else ''
end) + case TYPE_NAME(system_type_id)
  when 'text' then (('COUNT( CAST([' + "name" + '] AS varchar(1) ) ) AS [') + "name" + '_count]')
  else (('COUNT( [' + "name" + '] ) AS [') + "name" + '_count]')
end) @sql
from "sys"."columns"
where "object_id" = OBJECT_ID(@Table);
set sql = (('SELECT ' + @sql + ' FROM ') + @Table + ';');