2013-07-15 66 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或任何您的查詢接口。注意:刪除最後的+,因此它在語法上是正確的。