2014-01-08 7 views
0

У меня есть таблица, которая выглядит какСЧИТАЕТ количество столбцов, где условие истинно? SQL Server 2008 R2

ID Col1 Col2 Col3 Col4 
1 3  5 3 3 

То, что я хочу сделать, это подсчитать количество 3 с в данном ряду.

Я попытался

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

Что бы быть лучшим способом для достижения этой цели?

+1

Это признак сломанного дизайна - если у вас есть элементы данных, которые в некотором смысле то же «типа» вещи, например, что вы хотите запрос по всем этим значениям, они должны содержаться в одном столбце. Эта таблица должна иметь 3 столбца '(ID, , Col)' где '' является подходящим именем для любого элемента * данных *, который был встроен в * имя * этих четырех столбцов в качестве завершающих номеров, а затем у вас будет 4 * строки * - '(1,1,3)', '(1,2,5)', '(1,3,3)' и '(1,4,3)'. Затем запрос тривиален для записи. –

ответ

2

Основываясь на том, что ОП спросил, это может быть сделано

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 ответил простым способом! –

Смежные вопросы