2014-01-08 41 views
0

我有一個表,看起來像COUNT條件爲真的列數? SQL Server 2008 R2的

ID Col1 Col2 Col3 Col4 
1 3  5 3 3 

我想要做的是數這個特定的行中的3 S中的號碼。

我試圖實現這一目標的

select COUNT(*) 
from INFORMATION_SCHEMA.COLUMNS 
where TABLE_NAME = 'TableName' -- but obviously I need WHERE Col1 = 3 OR Col2 = 3... 

會是怎樣的最好方法?

+1

這是一個破碎的設計的標誌 - 如果你有在某種意義上的事同樣的「類型」,這樣要數據項查詢所有這些值,它們應該全部包含在單個列中。這個表格應該有3列'(ID,,Col)',其中''是一個合適的名稱,不管* data *項目是否被嵌入到這4列的*名稱中作爲尾部數字,然後你會有4 *行* - '(1,1,3)','(1,2,5)','(1,3,3)'和((1,4,3)')。該查詢然後寫入是微不足道的。 –

回答

2

基於什麼OP問,這是可以做到

select 
CASE WHEN Col1 = 3 then 1 ELSE 0 END + 
CASE WHEN Col2 = 3 then 1 ELSE 0 END + 
CASE WHEN Col3 = 3 then 1 ELSE 0 END + 
CASE WHEN Col4 = 3 then 1 ELSE 0 END 
From TableName 
+0

簡單而有效,謝謝!我太想了! – DtotheG

2

我真的不喜歡與PIVOT所以這裏使用應用解決方案的工作。

SELECT 
    T.id 
    , Val 
    , COUNT(*) 
FROM MyTable AS T 
CROSS APPLY (
    VALUES 
     (T.C1) 
     , (T.C2) 
     , (T.C3) 
     , (T.C4) 
) AS X(Val) 
GROUP BY T.Id, X.Val 
ORDER BY T.Id, X.val 
+0

必須記住這個 – DaImTo

0

請找到示例代碼:

  DECLARE @Query VARCHAR(MAX) = 'SELECT Count = ' 
     SELECT 
     @Query += '(CASE WHEN '+ COLUMN_NAME + ' = 3 THEN 1 ELSE 0 END) + ' 
     FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'TEST' AND COLUMN_NAME <> 'ID' 
     SET @Query = SUBSTRING(@Query, 1, DATALENGTH(@Query) - 2) + ' FROM TEST WHERE ID = 1' 
     EXEC(@Query) 
+0

我正在嘗試完整解決方案,意思是@hashbrown用簡單的方式回答! –