【问题标题】:SQL COUNT(column_name) from table name for all columnsSQL COUNT(column_name) 来自所有列的表名
【发布时间】:2021-02-09 00:17:22
【问题描述】:

我有大约 1000 列。我们可以通过排除每个字段的空值来获取表中每一列的数字记录吗? 表名查询中的 SQL COUNT(column_name) 不包括空值。但是手动为 1000 列执行此操作是不可能的。请让我知道是否有任何其他程序可以做到这一点。

【问题讨论】:

  • 单表真的有1000列吗?
  • 是的 GMB,我可以访问 600 列,在视图中
  • 您可以创建一个脚本来生成它,然后通过EXEC (@sql)执行它
  • 我无法想象 600 列是非常实用的,即使它是一个视图。至于回答你的问题,如果是我,我会依靠动态 SQL 为我编写查询,因为我懒得做那种事情。 IE。遍历特定视图的 sys.columns,并使用它来构造动态 sql。
  • 请告诉我问题。如何迭代 sys.columns 一个

标签: sql sql-server teradata teradata-sql-assistant


【解决方案1】:

这是一个使用动态 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 + ';');

【讨论】:

  • 我做了一个小修改以排除 text 列,因为这些列会破坏 COUNT 函数。
  • 非常感谢!!是否有可能您可以在 teradata 中重写此查询
  • @Akhira 我不熟悉 Teradata,但这里有一个在线工具可以帮助您转换它:https://www.jooq.org/translate/ 但是,我更新了我的示例以包括文本字段的计数。我还为 Teradata 进行了转换并更新了我的答案。
  • Jooq 的“翻译”太糟糕了 :-)
  • 在这种特殊情况下,蹩脚意味着无用。转换后的查询绝不是 Teradata 的有效 sql。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多