计算具有特定值的列数

4

我有一个表格,长这样:

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。因此,结果应如下所示:

ID    Count
1     2
2     1
3     2
4     4

你的列会一直是x1、x2、x3和x4吗? - Vamsi Prabhala
是的,我将始终拥有这些列。 - rottenbanana
3个回答

6

试试这个:

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

这个查询使用表值构造器创建一个内联表,其是最初表的。通过在这个内联表上执行COUNT,您可以得到大于零的列数。如果您有超过4列,我认为这个方法很好扩展。您可以在此处查看演示

这是一个很棒的解决方案。谢谢。 - rottenbanana

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

虽然这很容易编码,但你拥有的列越多,你的选择就会变得越大,并且你将不得不添加更多的列。


有没有办法避免编写所有列名?还是这只是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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接