2012-09-27 58 views
1

我有一个约150列的表。我想为每列找到count(distinct(colName)),但是想知道是否有一种方法可以实际输入每个列名。我想使用count(distinct(*))但这不起作用。SQL Server计数表中每列的不同值的数量

其他建议?

编辑:

如果这是我的表:

id   col1   col2  col3  ... 
    01   10001  west   north 
    02   10001  west   south 
    03   10002  east   south 
    04   10002  west   north 
    05   10001  east   south 
    06   10003  west   north 

我在寻找这个输出

count(distinct(id)) count(distinct(col1)) count(distinct(col2)) count(distinct(col3)) 
     6      3     2      2 
+0

等待有可能有一个单一列名称使用多次?或者你有一个存储列名值的字段? –

回答

0

我不相信这是可能的只是MySQL的。 我想你将不得不使用服务器端语言来获得你想要的结果。

使用“DESC TABLE”作为第一个查询,然后为每个“字段”行编译查询。


忽略这一点,错误的系统标签:)

+0

SQL-Server标记,而不是MySql。 –

-1

这应该这样做:

select count(*) from (select distinct * from myTable) as t 

这里是SQL Fiddle测试。

create table Data 
(
    Id int, 
    Data varchar(50) 
) 

insert into Data 
select 1, 'ABC' 
union all 
select 1, 'ABC' 

select count(*) 
from (select distinct * from Data) as t 
+0

不幸的是,这不起作用,它只是返回总行数... –

+0

仅返回总行数,不起作用。 – trollster

5

你可以这样做:

DECLARE @query varchar(max) 
    SELECT @query = 
    'SELECT ' + SUBSTRING((SELECT ',' +'COUNT(DISTINCT(' + column_name + ')) 
      As ' + column_name + ' ' 
      FROM information_schema.columns 
      WHERE 
      table_name = 'table_name' 
      for xml path('')),2,200000) + 'FROM table_name' 

PRINT(@query) 
0

使用下面的脚本来建立T-SQL查询,将在一个表中返回的每一列的重复计数。用您的表名替换@Table值。

DECLARE @Table SYSNAME = 'TableName'; 

-- REVERSE and STUFF used to remove trailing UNION in string 
SELECT REVERSE(STUFF(REVERSE((SELECT 'SELECT ''' + name 
            + ''' AS [Column], COUNT(DISTINCT(' 
            + QUOTENAME(name) + ')) AS [Count] FROM ' 
            + QUOTENAME(@Table) + ' UNION ' 
           -- get column name from sys.columns 
           FROM sys.columns 
           WHERE object_id = Object_id(@Table) 
           -- concatenate result strings with FOR XML PATH 
           FOR XML PATH (''))), 1, 7, ';')); 
相关问题