SQL - 如何计算是和否项目

时间:2011-08-23 13:52:12

标签: sql sql-server

我正在使用SQL Server 2008。

我正在编写一个查询,我需要计算多少个(1)和多少个(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是个好主意吗?馊主意?矫枉过正?

有没有更好的方法来计算yes和nos和NULL?

3 个答案:

答案 0 :(得分:6)

CASE(双关语)是完美的案例

CASE是一个非常优化的运算符,专为此类使用场景而设计。

条件计数的正常语法如下:

SELECT SUM (CASE WHEN x=y then 1 ELSE 0 END) as 'XequalsY'
...

答案 1 :(得分:6)

如果这是你的意思,我认为使用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

答案 2 :(得分:2)

select count(nullif(IsBestValue, 0)) as TotalBestValueYes,
       count(nullif(IsBestValue, 1)) as TotalBestValueNo,
       count(case when IsBestValue is null then 1 end) as TotalBestValueNull