2013-07-15 42 views
0

我有一个视图,它在水平透视表中有200列数据。我想在这200列中使用COUNT()或SUM()。如何在不写一个庞大的SQL查询的情况下完成这个任务,我必须写出每一列?横向计算列

我想象中:

COUNT([Column 1] -> [Column 200]) // Counts all values in Column 1 through Column 200. 

如何真的是:

COUNT([Column 1]) + COUNT([Column 2 ]) + COUNT([Column 3])... AS 'Total' 

注:

我将这个算到另一个查询在那里我被另一列分组名称。

回答

7

如果你要计算的是对行中的任意值的列没有明确地写每一列,那么你可以使用XML PATH(尽管它假定每列的数据类型相同,我真的不知道关于你的数据集的性能):

SELECT T2.X.value('count(*/text())', 'int') as ColumnCount 
FROM YourTable AS T1 
CROSS APPLY (SELECT T1.* 
      FOR XML PATH(''), TYPE) AS T2(X) 
+0

这个'SUM()'版本会忽略任何带有字符的字段,但是如果你有任何字段持有你不想添加的整数(比如'ID'),你可以通过使用一个子查询:'FROM(SELECT ID * -1'NegID',* \t FROM#Table1 \t)AS T1'例如。 –

+0

@GoatCO感谢您的信息。 – Lamak

+0

不幸的是,我在每一列中都没有相同的数据类型。我假设这就是为什么这个方法不起作用,因为我在没有转换的数据集中有日期/时间戳。我总是可以将200列与主键放在一个单独的视图中,然后将它们结合在一起。 – Fastidious

0

你将不得不写每一列。

最简单的方法是获取列的列表,并使用SQL或Excel来创建所需的表达式。这里是一个例子:

select '['+Column_Name+'] +' 
from Information_Schema.columns c 
where table_name = @YourTableName 

然后,您可以将代码复制到SSMS或任何您的查询接口。注意:删除最后的+,因此它在语法上是正确的。