【问题标题】:Display Count and distinct values for all columns in a table显示表中所有列的计数和不同值
【发布时间】:2017-10-06 19:00:02
【问题描述】:

我有一个有 700 列的表。我正在尝试获取每列的不同值及其计数的列表。我正在使用以下查询来获取 1 列的结果

Select distinct col1, count(*) from MyTable group by 1.

结果:

col1    count(*)
a       10
b       20
c       40

如何以最佳方式使用单个查询获取所有列的结果?

【问题讨论】:

  • 700 列?那是一个 wiiiide 表,我们今天已经得到了我们每天 WTF 问题的份额。动态sql循环
  • 用您正在使用的数据库标记您的问题。

标签: sql


【解决方案1】:

基本查询是:

select col001, count(*) from MyTable group by col001 union all
select col002, count(*) from MyTable group by col002 union all
. . . 
select col700, count(*) from MyTable group by col700 ;

不愉快,但这基本上是您需要运行的查询。 SQL 并没有真正比单独执行多个独立聚合更有效(根据我的经验,即使使用grouping sets)。

您可以构造查询。一种方法是运行这样的东西:

select replace(replace('select [col], count(*) as cnt from [tab] group by [col] union all ',
                       '[tab]', table_name
                      ), '[col]', column_name
               )
from information_schema.columns
where table_name = 'mytable' and table_schema = ??;

然后您可以复制生成的 SQL(删除最后的 union all)并运行它。

注意:以上是通用的;确切的代码可能因数据库而异。

【讨论】:

    【解决方案2】:

    每列都有不同值的列表是不可能的。如果 A 列有 5 个不同的值,而 B 列有 7 个值会怎样。您的列表会是什么样子?

    另一个问题更简单,但正如@Gordon Linoff 所说,需要两个步骤。详细说明他的答案,对于 MS SQL:

    select replace(replace(' count(distinct([col])) as [col],',
                           '[tab]', table_name
                          ), '[col]', column_name
                   )
    from information_schema.columns
    where table_name = 'your_table';
    

    复制结果并将它们粘贴到新的查询窗口之间。

    SELECT
    [[results query 1]]
    FROM your_table
    

    记得从查询 1 结果中删除最后一个“,”。

    【讨论】:

      【解决方案3】:

      将 [table name] 替换为您需要计数的表。

      DECLARE @table varchar(100) = '[table name]'
      DECLARE @i INT = 1, @cntOUT int, @SQL nvarchar(500) = ''
      DECLARE @ParmDef nvarchar(500) = N'@cnt int OUTPUT'; 
      
      SELECT column_id, name, 0 as record_count
      INTO #T1  
      FROM sys.all_columns c 
      WHERE c.object_id = (SELECT object_id FROM sys.objects WHERE name = @table AND type = 'U')
      
      WHILE @i <= (SELECT MAX(column_id) FROM #T1)
      BEGIN
          SELECT @SQL = 'SELECT @cnt = COUNT(DISTINCT ' + name + ') FROM ' + @table + ';' 
          FROM #T1 WHERE column_id = @i;
      
          EXECUTE sp_executesql @stmt = @SQL, @ParmDefinition = @ParmDef, @cnt = @cntOUT OUTPUT;
          UPDATE #T1 SET record_count = @cntOUT WHERE column_id = @i
          SET @i = @i + 1
      END
      
      SELECT * FROM #T1
      --DROP TABLE #T1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-11
        • 1970-01-01
        • 2015-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多