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的设计,我必须写出所有特定的列名?喜欢写一系列列吗?这是一个简洁的解决方案。谢谢