Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算有多少列具有特定值_Sql_Sql Server - Fatal编程技术网

Sql 计算有多少列具有特定值

Sql 计算有多少列具有特定值,sql,sql-server,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 Count 1 2 2 1 3 2 4 4 我希望能够查询该行并返回ID,其中列数大于0作为该行的值。因此,结果如下所示: ID x1 x2 x3

我有一张这样的桌子:

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    Count
1     2
2     1
3     2
4     4
我希望能够查询该行并返回ID,其中列数大于0作为该行的值。因此,结果如下所示:

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    Count
1     2
2     1
3     2
4     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
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
选择
身份证件
当x1 0然后1或0结束时的情况+
当x2 0然后1或0结束时的情况+
当x3 0然后1其他0结束+
当x4 0然后1或0作为计数结束时的情况
从MyTable

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

如果您在设计时有一组已知的固定列,这应该可以满足您的需要:

 SELECT ID,
        IIF (x1 > 0, 1, 0) + 
        IIF (x2 > 0, 1, 0) + 
        IIF (x3 > 0, 1, 0) + 
        IIF (x4 > 0, 1, 0) 
 FROM MyTable
试试这个:

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
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
此查询使用创建一个行为初始表的列的内嵌表。在这个内联表上执行
计数
,可以得到大于零的列数

我认为如果你有超过4列的话,这个比例会很好


您是否总是有x1、x2、x3、x4列?是的,我总是有这些列?有没有办法对所有列名进行编码?或者这只是SQL的设计,我必须写出所有特定的列名?喜欢写一系列列吗?这是一个简洁的解决方案。谢谢