计算有多少列具有特定值

时间:2015-07-23 14:43:44

标签: sql sql-server

我有一个看起来像这样的表:

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

我希望能够查询这个并返回ID,其中包含大于0的列数作为该行中的值。所以结果看起来像这样:

ID    Count
1     2
2     1
3     2
4     4

3 个答案:

答案 0 :(得分:5)

试试这个:

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

虽然这很容易编码,但您拥有的列数越多,您选择的字段越多,您需要添加的列数就越多。

答案 1 :(得分:5)

试试这个:

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,您可以获得大于零的列数。

我认为如果您有超过4列,这可以很好地扩展。

Demo here

答案 2 :(得分: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