SQL:计数列等于值

时间:2016-05-27 09:38:41

标签: sql sql-server case

我有一张桌子,我想写一个查询,显示所有列的行到' 0'但是一个。

T_CELKO_TEN_IN_ON_TIO(TIO_ID,TIO_1,TIO_2,TIO_3,TIO_4,TIO_5,TIO_6,TIO_7,TIO_8,TIO_9,TIO_10); 

我有数字

例如,如果我有:

1(id)        0        1        1        0        0        0        0        0        0        0
2(id)        0        0        0        0        0        0        0        1        0        0
3(id)        0        1        -2       3        -4       5        -6       7        -8       5

因此查询应该打印:

2(id)        0        0        0        0        0        0        0        1        0        0

我写了这个查询:

Select * from T_CELKO_TEN_IN_ON_TIO where SUM  (CASE WHEN  TIO_1='0' THEN 1 ELSE 0 END OR
                                               TIO_2='0' THEN 1 ELSE 0 END OR
                                               TIO_3='0' THEN 1 ELSE 0 END OR
                                               TIO_4='0' THEN 1 ELSE 0 END OR
                                               TIO_5='0' THEN 1 ELSE 0 END OR
                                               TIO_6='0' THEN 1 ELSE 0 END OR
                                               TIO_7='0' THEN 1 ELSE 0 END OR
                                               TIO_8='0' THEN 1 ELSE 0 END OR
                                               TIO_9='0' THEN 1 ELSE 0 END OR 
                                               TIO_10='0' THEN 1 ELSE 0 END)=9;

我收到一个错误:在预期条件的上下文中指定的非布尔类型的表达式,接近' OR' 但我认为即使我的查询也不起作用。

2 个答案:

答案 0 :(得分:1)

我希望我理解正确:

SUM是一个聚合函数,不能在此上下文中使用。在我的代码中,我测试每个值(假设它们是数字),如果它们是1,零或其他。所有其他值都返回1000.因此,这些值的纯粹总和应仅为" 1"如果有很多" 0"并且只有一个" 1"价值......

Select * from T_CELKO_TEN_IN_ON_TIO 
where ( CASE TIO_1 WHEN 1 THEN 1 WHEN 0 THEN 0 ELSE 1000 END
      + CASE TIO_2 WHEN 1 THEN 1 WHEN 0 THEN 0 ELSE 1000 END
      + CASE TIO_3 WHEN 1 THEN 1 WHEN 0 THEN 0 ELSE 1000 END
      + CASE TIO_4 WHEN 1 THEN 1 WHEN 0 THEN 0 ELSE 1000 END
      + CASE TIO_5 WHEN 1 THEN 1 WHEN 0 THEN 0 ELSE 1000 END
      + CASE TIO_6 WHEN 1 THEN 1 WHEN 0 THEN 0 ELSE 1000 END
      + CASE TIO_7 WHEN 1 THEN 1 WHEN 0 THEN 0 ELSE 1000 END
      + CASE TIO_8 WHEN 1 THEN 1 WHEN 0 THEN 0 ELSE 1000 END
      + CASE TIO_9 WHEN 1 THEN 1 WHEN 0 THEN 0 ELSE 1000 END
      + CASE TIO_10 WHEN 1 THEN 1 WHEN 0 THEN 0 ELSE 1000 END)=1;

更新

我弄错了,因为我认为你想要处理" 1"分别。这应该是你真正需要的:

Select * from T_CELKO_TEN_IN_ON_TIO 
where ( CASE TIO_1 WHEN 0 THEN 1 ELSE 0 END
      + CASE TIO_2 WHEN 0 THEN 1 ELSE 0 END
      + CASE TIO_3 WHEN 0 THEN 1 ELSE 0 END
      + CASE TIO_4 WHEN 0 THEN 1 ELSE 0 END
      + CASE TIO_5 WHEN 0 THEN 1 ELSE 0 END
      + CASE TIO_6 WHEN 0 THEN 1 ELSE 0 END
      + CASE TIO_7 WHEN 0 THEN 1 ELSE 0 END
      + CASE TIO_8 WHEN 0 THEN 1 ELSE 0 END
      + CASE TIO_9 WHEN 0 THEN 1 ELSE 0 END
      + CASE TIO_10 WHEN 0 THEN 1 ELSE 0 END)=9;

答案 1 :(得分:1)

可能你想要这样的东西。

Select * from T_CELKO_TEN_IN_ON_TIO 
   where SUM (CASE WHEN  TIO_1='0' THEN 1 
                   WHEN TIO_2='0' THEN 1
                   WHEN TIO_3='0' THEN 1
                   WHEN TIO_4='0' THEN 1
                   WHEN TIO_5='0' THEN 1
                   WHEN TIO_6='0' THEN 1
                   WHEN TIO_7='0' THEN 1
                   WHEN TIO_8='0' THEN 1
                   WHEN TIO_9='0' THEN 1
                   WHEN TIO_10='0' THEN 1 ELSE 0 END) = 9;