2015-07-23 3 views
3

У меня есть таблица, которая выглядит следующим образом:Подсчитайте, сколько столбцов имеют определенное значение

ID x1 x2 x3 x4 
1  20 30 0  0 
2  60 0  0  0 
3  10 30 0  0 
4  30 30 30 30 

Я хочу, чтобы иметь возможность запросить это и вернуть идентификатор с числом столбцов, которые имеют более чем 0, как их значение в этой строке. Таким образом, результат будет выглядеть следующим образом:

ID Count 
1  2 
2  1 
3  2 
4  4 
+0

будет у вас всегда есть столбцы x1, x2, x3, x4? –

+0

Да, у меня всегда будут эти столбцы – rottenbanana

ответ

4

Попробуйте это:

SELECT ID, z.cnt 
FROM mytable 
CROSS APPLY (SELECT COUNT(*) AS cnt 
      FROM (VALUES (x1), (x2), (x3), (x4)) x(y) 
      WHERE x.y > 0) z 

Этот запрос делает использование Table Value Constructor чтобы создать в строке таблицы находятся столбцы исходной таблицы. Выполняя COUNT в этой встроенной таблице, вы можете получить число столбцов, большее нуля.

Я думаю, что это хорошо масштабируется, если у вас более четырех столбцов.

Demo here

+0

Это аккуратное решение. благодаря – rottenbanana

4

Попробуйте это:

Select 
    ID, 
    Case When x1 <> 0 Then 1 Else 0 End + 
    Case When x2 <> 0 Then 1 Else 0 End + 
    Case When x3 <> 0 Then 1 Else 0 End + 
    Case When x4 <> 0 Then 1 Else 0 End as Count 
From MyTable 

Хотя это легко кода, тем больше столбцов вы имеете, тем больше ваш выбор будет больше столбцов вы придется добавить.

+0

Есть ли способ, связанный с кодированием всех имен столбцов? Или это просто SQL по дизайну, что я должен написать все имена столбцов? Как написать диапазон столбцов вместо? – rottenbanana

1

Это должно делать то, что вам нужно, если у вас есть фиксированный набор столбцов, известных во время разработки:

SELECT ID, 
     IIF (x1 > 0, 1, 0) + 
     IIF (x2 > 0, 1, 0) + 
     IIF (x3 > 0, 1, 0) + 
     IIF (x4 > 0, 1, 0) 
FROM MyTable 
Смежные вопросы