我有一个看起来像这样的表:
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
答案 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列,这可以很好地扩展。
答案 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