在一个sql查询中计算很多布尔字段?

时间:2009-11-25 00:55:48

标签: sql sql-server sql-server-2005 tsql

不确定如何解释这个但是想象你有一个包含许多布尔字段的表......就像这样......

表:汽车

列:

  

自动:布尔值

     

Silver:boolean

     

American:boolean

     

吵闹:布尔

     

臭臭:布尔

     

fast:boolean

(愚蠢的田地,其中大部分都不会在现实中起作用,只是一个例子)

我需要做的是生成这些字段的列表,每个字段旁边都有一些搜索结果,所以如果数据库中有100辆银色车和57辆美国车,那么列表可能看起来有点像这样。

  

自动:(150)

     

银(100)

     

美国人(57)

     

吵闹(120)

     

臭臭(124)

     

快(45)

所以,它基本上就像一个过滤器列表,如果用户点击“银色”,他们会缩小搜索范围,只显示银色汽车,他们知道他们将得到100个结果。然后,所有其他过滤器旁边的数字将减少,因为我们已经过滤掉所有不是白银的汽车。

计算一个字段的出现很容易......

SELECT COUNT(*)FROM CARS WHERE Automatic = true;

...会给我第一行例如。但是我不想为每个过滤器做一个SQL语句,因为它们可能超过30个。我已经看到很多网站这样做,所以它必须比我想象的要容易。

真的很感激任何帮助:)

乔恩

3 个答案:

答案 0 :(得分:12)

使用sql server 2008尝试对数据类型的字段进行求和时,会出现以下错误:

  

Msg 8117,Level 16,State 1,Line 10

     

操作数数据类型位无效   总和算子。

所以你可以试试这个:

SELECT SUM(CAST(Automatic AS TINYINT)) as Automatic, SUM(CAST(Smelly AS TINYINT)) as Smelly, SUM(CAST(American AS TINYINT)) as Japanese FROM YourTable

答案 1 :(得分:6)

假设该位为1/0,则可以使用SUM而不是COUNT:

SELECT SUM(Automatic) as Automatic, SUM(Smelly) as Smelly, SUM(American) as Japanese FROM ...

答案 2 :(得分:4)

如果它不是1/0,那么,根据真值,你可以这样做:

  Select
     Sum(Case When Automatic = truevalue Then 1 Else 0 End) as Automatic,
     Sum(Case When Smelly = truevalue   Then 1 Else 0 End) as Smelly,
     Sum(Case When American = truevalue   Then 1 Else 0 End) as American,
     Sum(Case When Noisy = truevalue   Then 1 Else 0 End) as Noisy
  From Table