我需要一个返回表的查询,其中每列是另一个表的列中不同值的计数。
我知道如何计算一列中的不同值:
select count(distinct columnA) from table1;
我想我可以把它作为一个很长的选择条款:
select count(distinct columnA), count(distinct columnB), ... from table1;
但这不是很优雅,而且是硬编码的。我更喜欢更灵活的东西。
答案 0 :(得分:3)
试试这个(sql server 2005语法):
DECLARE @YourTable table (col1 varchar(5)
,col2 int
,col3 datetime
,col4 char(3)
)
insert into @YourTable values ('abcdf',123,'1/1/2009','aaa')
insert into @YourTable values ('aaaaa',456,'1/2/2009','bbb')
insert into @YourTable values ('bbbbb',789,'1/3/2009','aaa')
insert into @YourTable values ('ccccc',789,'1/4/2009','bbb')
insert into @YourTable values ('aaaaa',789,'1/5/2009','aaa')
insert into @YourTable values ('abcdf',789,'1/6/2009','aaa')
;with RankedYourTable AS
(
SELECT
ROW_NUMBER() OVER(PARTITION by col1 order by col1) AS col1Rank
,ROW_NUMBER() OVER(PARTITION by col2 order by col2) AS col2Rank
,ROW_NUMBER() OVER(PARTITION by col3 order by col3) AS col3Rank
,ROW_NUMBER() OVER(PARTITION by col4 order by col4) AS col4Rank
FROM @YourTable
)
SELECT
SUM(CASE WHEN col1Rank=1 THEN 1 ELSE 0 END) AS col1DistinctCount
,SUM(CASE WHEN col2Rank=1 THEN 1 ELSE 0 END) AS col2DistinctCount
,SUM(CASE WHEN col3Rank=1 THEN 1 ELSE 0 END) AS col3DistinctCount
,SUM(CASE WHEN col4Rank=1 THEN 1 ELSE 0 END) AS col4DistinctCount
FROM RankedYourTable
输出:
col1DistinctCount col2DistinctCount col3DistinctCount col4DistinctCount
----------------- ----------------- ----------------- -----------------
4 3 6 2
(1 row(s) affected)
答案 1 :(得分:1)
此代码应该为“table1”中的所有列提供每个列的相应不同值计数作为数据。
DECLARE @TableName VarChar (Max) = 'table1'
DECLARE @SqlString VarChar (Max)
set @SqlString = (
SELECT DISTINCT
'SELECT ' +
RIGHT (ColumnList, LEN (ColumnList)-1) +
' FROM ' + Table_Name
FROM INFORMATION_SCHEMA.COLUMNS COL1
CROSS AppLy (
SELECT ', COUNT (DISTINCT [' + COLUMN_NAME + ']) AS ' + '''' + COLUMN_NAME + ''''
FROM INFORMATION_SCHEMA.COLUMNS COL2
WHERE COL1.TABLE_NAME = COL2.TABLE_NAME
FOR XML PATH ('')
) TableColumns (ColumnList)
WHERE
1=1 AND
COL1.TABLE_NAME = @TableName
)
EXECUTE (@SqlString)
答案 2 :(得分:1)
它是硬编码的。
为sql语句提供字段列表并不是硬编码。这是常见且可接受的做法。
答案 3 :(得分:0)
对于表格中的每个字段,这不一定是可能的。例如,除非将它们转换为其他数据类型并丢失一些精度,否则不能对SQL Server ntext或image字段执行DISTINCT。
答案 4 :(得分:0)
我感谢所有回复。我认为在这种情况下最适合我的解决方案(计算表中每列中不同值的数量,除了其名称之外不知道表的外部程序)如下:
运行“describe table1”并从结果中提取列名。
循环遍历列名并创建查询以计算每列中的不同值。查询看起来像“select count(distinct columnA),count(distinct columnB),... from table1”。
答案 5 :(得分:-3)
DISTINCT是邪恶的。做COUNT / GROUP BY