2009-11-25 3 views
7

Не знаю точно, как это объяснить, но томографию у вас есть таблица с большим количеством логических полей, как это ......Подсчет количества булевых полей в одном запросе sql?

Таблица: Автомобили

Колонка:

Automatic: булева

Серебро: булево

American: булево

Noisy: булево

Вонючий: булево

быстро: булево

(глупые поля и большинство из них не будет Bools в реальности, но просто пример)

Я необходимо сделать список этих полей с рядом результатов поиска рядом с каждым, поэтому, если в базе данных было 100 серебряных автомобилей и 57 американских автомобилей, список мог бы выглядеть примерно так ...

Автоматический: (150)

серебро (100)

Американский (57)

Шумная (120)

Зловонная (124)

быстро (45)

Итак, это в основном как список fi Если пользователь нажимает «серебро», они будут сузить поиск, чтобы показывать только серебряные автомобили, и они знают, что получат 100 результатов. Затем числа рядом со всеми другими фильтрами уменьшатся, потому что мы отфильтровали все автомобили, которые не являются серебристыми.

Подсчет вхождений одного поля будет легко ....

SELECT COUNT (*) FROM АВТОМОБИЛЕЙ WHERE Automatic = истина;

... дал бы мне первую строку, например. Но я не хочу делать одну инструкцию SQL для каждого фильтра, поскольку их может быть более 30. Я видел, как много сайтов делают это, поэтому это должно быть проще, чем я думаю.

Любая помощь будет действительно оценили :)

Jon

ответ

6

Предполагая, что бит равен 1/0, то вы можете SUM вместо COUNT:

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

Звуки идеально. Благодарю. – jonhobbs

3

Если это уже не 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 
12

С sql server 2008 whe п пытается подвести поле типа данных битого следующее ocures ошибки:

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 
Смежные вопросы