Tsql 计算每个用户的有效值

Tsql 计算每个用户的有效值,tsql,count,Tsql,Count,我有一个带有值列表的表-1是一个空白值: ID FieldType1A FieldType1B FieldType2A FieldType2B Person 1 15 14 10 -1 1 2 16 -1 12 10 1 3 17 -1 5

我有一个带有值列表的表-1是一个空白值:

 ID    FieldType1A FieldType1B FieldType2A FieldType2B Person
  1             15          14          10          -1      1
  2             16          -1          12          10      1
  3             17          -1           5           6      1
  4              6          -1           7          -1      2
 ...
因此,结果应该是:

 Person      FieldType1     FieldType2
      1               4              5
      2               1              1

有一个带有用户ID列表的users表,是否有一种方法可以迭代该值列表以在结果集中生成person列表(对于字段类型,0是完全有效的,因为它只是计数)?我认为答案是朝着我尝试的方向迈出的一步,但不确定如何组合相同的列(a/B允许答案列表)。我对组合所有有效值感兴趣,因为我不想计算每个有效响应的数量。

您可以使用
大小写
表达式将所有非负一值更改为1,-1值更改为0,然后将它们相加

SELECT Person, 
    SUM(CASE WHEN FieldType1A <> -1 THEN 1 ELSE 0 END) + 
        SUM(CASE WHEN FieldType1B <> -1 THEN 1 ELSE 0 END) AS FieldType1,
    SUM(CASE WHEN FieldType2A <> -1 THEN 1 ELSE 0 END) + 
        SUM(CASE WHEN FieldType2B <> -1 THEN 1 ELSE 0 END) AS FieldType2
FROM YourTable
GROUP BY Person
选择人物,
总和(字段类型1A-1时为1,否则为0结束时为1)+
总和(当FieldType1B-1时为1,否则为0结束)为FieldType1,
总和(字段类型2A-1时为1,否则为0结束时为1)+
将字段类型2B-1和字段类型2相加(如果字段类型2B-1,则为1,否则为0结束)
从你的桌子上
分组

Oooh,+1表示
NULLIF
;我总是忘记那个函数。那正是我想要的。运行速度比我使用的C代码快得多。谢谢
SELECT Person, 
count(nullif(FieldType1A, -1)) + count(nullif(FieldType1B, -1)) as FieldType1, 
count(nullif(FieldType2A, -1)) + count(nullif(FieldType2B, -1)) as FieldType2
FROM yourtable
GROUP BY person