我有一个看起来像这样的表:
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
Run Code Online (Sandbox Code Playgroud)
我希望能够查询这个并返回ID,其中包含大于0的列数作为该行中的值.所以结果看起来像这样:
ID Count
1 2
2 1
3 2
4 4
Run Code Online (Sandbox Code Playgroud)
试试这个:
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
Run Code Online (Sandbox Code Playgroud)
虽然这很容易编码,但是您拥有的列越多,您选择的列越多,您需要添加的列越多.
试试这个:
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
Run Code Online (Sandbox Code Playgroud)
此查询使用表值构造函数来创建内联表,其行是初始表的列.COUNT在此内联表上执行a ,您可以获得大于零的列数.
我认为如果你有超过4列,这可以很好地扩展.
| 归档时间: |
|
| 查看次数: |
2378 次 |
| 最近记录: |