SQL – как считать «да» и «нет»

Я использую SQL Server 2008.

Я пишу запрос, где мне нужно подсчитать, сколько yesses (1) и сколько nos (0 или NULL).

SELECT B.Brand, B.BrandID, COUNT(M.ModelID) AS TotalModels FROM Brands B LEFT JOIN Models M ON B.BrandID = M.BrandID GROUP BY B.Brand, B.BrandID ORDER BY B.Brand 

В таблице Model есть другое поле, называемое IsBestValue, которое будет NULL, 0 или 1. Я хочу иметь возможность подсчитывать TotalBestValueYes, TotalBestValueNo и TotalBestValueNULL.

Давно … Я использую что-то вроде ..

 (CASE WHEN IsBestValue = 1 END) // ADD ONE TO TotalBestValueYes (CASE WHEN IsBestValue = 0 END) // ADD ONE TO TotalBestValueNo (CASE WHEN IsBestValue = NULL END) // ADD ONE TO TotalBestValueNULL 

Использует ли CASE в моде хорошую идею? Плохая идея? Overkill?

Есть ли лучший способ подсчета yesses и nos и NULL?

Я не вижу ничего плохого в использовании CASE, если это то, что вы имеете в виду.

 SELECT B.Brand, B.BrandID, COUNT(M.ModelID) AS TotalModels, SUM((CASE WHEN M.IsBestValue = 1 THEN 1 ELSE 0 END)) TotalBestValueYes, SUM((CASE WHEN M.IsBestValue = 0 THEN 1 ELSE 0 END)) TotalBestValueNo, SUM((CASE WHEN M.IsBestValue IS NULL THEN 1 ELSE 0 END)) TotalBestValueNull, FROM Brands B LEFT JOIN Models M ON B.BrandID = M.BrandID GROUP BY B.Brand, B.BrandID ORDER BY B.Brand 

Это идеальный случай для CASE (каламбур).

CASE – очень хорошо оптимизированный оператор и предназначен для такого сценария использования.

Нормальный синтаксис условного подсчета соответствует строкам:

 SELECT SUM (CASE WHEN x=y then 1 ELSE 0 END) as 'XequalsY' ... 
 select count(nullif(IsBestValue, 0)) as TotalBestValueYes, count(nullif(IsBestValue, 1)) as TotalBestValueNo, count(case when IsBestValue is null then 1 end) as TotalBestValueNull 
Давайте будем гением компьютера.